summaryrefslogtreecommitdiffstats
path: root/src/software/openlmi/software/cimom_entry.py
blob: 7d39a212faffeb5e4c86b6c4e6cd7a2ec009e6b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# -*- encoding: utf-8 -*-
# Software Management Providers
#
# Copyright (C) 2012-2013 Red Hat, Inc.  All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
# Authors: Michal Minar <miminar@redhat.com>
#

"""
Entry module for OpenLMI Software providers.
"""

from multiprocessing import Queue
from openlmi.common import cmpi_logging
from openlmi.common import JobManager
from openlmi.common.IndicationManager import IndicationManager
from openlmi.software.core import Job
from openlmi.software.LMI_SoftwareIdentity import LMI_SoftwareIdentity
from openlmi.software.LMI_SystemSoftwareCollection import \
        LMI_SystemSoftwareCollection
from openlmi.software.LMI_HostedSoftwareCollection import \
        LMI_HostedSoftwareCollection
from openlmi.software.LMI_MemberOfSoftwareCollection import \
        LMI_MemberOfSoftwareCollection
from openlmi.software.LMI_InstalledSoftwareIdentity import \
        LMI_InstalledSoftwareIdentity
from openlmi.software.LMI_SoftwareIdentityResource import \
        LMI_SoftwareIdentityResource
from openlmi.software.LMI_ResourceForSoftwareIdentity import \
        LMI_ResourceForSoftwareIdentity
from openlmi.software.LMI_HostedSoftwareIdentityResource import \
        LMI_HostedSoftwareIdentityResource
from openlmi.software.LMI_SoftwareInstallationService import \
        LMI_SoftwareInstallationService
from openlmi.software.LMI_SoftwareInstallationServiceCapabilities import \
        LMI_SoftwareInstallationServiceCapabilities
from openlmi.software. \
        LMI_AssociatedSoftwareInstallationServiceCapabilities import \
        LMI_AssociatedSoftwareInstallationServiceCapabilities
from openlmi.software.LMI_HostedSoftwareInstallationService import \
        LMI_HostedSoftwareInstallationService
from openlmi.software.LMI_SoftwareInstallationServiceAffectsElement import \
        LMI_SoftwareInstallationServiceAffectsElement
from openlmi.software.LMI_SoftwareJob import LMI_SoftwareJob
from openlmi.software.LMI_SoftwareMethodResult import \
        LMI_SoftwareMethodResult
from openlmi.software.LMI_AffectedSoftwareJobElement import \
        LMI_AffectedSoftwareJobElement
from openlmi.software.LMI_AssociatedSoftwareJobMethodResult import \
        LMI_AssociatedSoftwareJobMethodResult
from openlmi.software.LMI_OwningSoftwareJobElement import \
        LMI_OwningSoftwareJobElement
from openlmi.software.LMI_SoftwareIdentityFileCheck import \
        LMI_SoftwareIdentityFileCheck
from openlmi.software.LMI_SoftwareIdentityChecks import \
        LMI_SoftwareIdentityChecks
from openlmi.software.yumdb import jobmanager, YumDB

def get_providers(env):
    """
    @return mapping of provider names to corresponding provider instances.
    """
    cmpi_logging.LogManager.LOGGER_NAME = 'openlmi.software'
    cmpi_logging.LogManager(env)

    # jobmanager does not understand CIM models, give it a way to transform
    # job to CIMIndication instance
    jobmanager.JOB_TO_MODEL = lambda job: Job.job2model(job, keys_only=False)

    providers = {
        "LMI_SoftwareIdentity"            : LMI_SoftwareIdentity(env),
        "LMI_SystemSoftwareCollection"    : LMI_SystemSoftwareCollection(env),
        "LMI_HostedSoftwareCollection"    : LMI_HostedSoftwareCollection(env),
        "LMI_MemberOfSoftwareCollection"  : LMI_MemberOfSoftwareCollection(env),
        "LMI_InstalledSoftwareIdentity"   : LMI_InstalledSoftwareIdentity(env),
        "LMI_SoftwareIdentityResource"    : LMI_SoftwareIdentityResource(env),
        "LMI_ResourceForSoftwareIdentity" :
                LMI_ResourceForSoftwareIdentity(env),
        "LMI_HostedSoftwareIdentityResource" :
                LMI_HostedSoftwareIdentityResource(env),
        "LMI_SoftwareInstallationService" : \
                LMI_SoftwareInstallationService(env),
        "LMI_SoftwareInstallationServiceCapabilities" : \
                LMI_SoftwareInstallationServiceCapabilities(env),
        "LMI_AssociatedSoftwareInstallationServiceCapabilities" : \
                LMI_AssociatedSoftwareInstallationServiceCapabilities(env),
        "LMI_HostedSoftwareInstallationService" : \
                LMI_HostedSoftwareInstallationService(env),
        "LMI_SoftwareInstallationServiceAffectsElement" : \
                LMI_SoftwareInstallationServiceAffectsElement(env),
        "LMI_SoftwareJob"                 : LMI_SoftwareJob(env),
        "LMI_SoftwareInstallationJob"     : LMI_SoftwareJob(env),
        "LMI_SoftwareVerificationJob"     : LMI_SoftwareJob(env),
        "LMI_SoftwareInstCreation"        : LMI_SoftwareJob(env),
        "LMI_SoftwareInstModification"    : LMI_SoftwareJob(env),
        "LMI_SoftwareMethodResult"        : LMI_SoftwareMethodResult(env),
        "LMI_AffectedSoftwareJobElement"  : LMI_AffectedSoftwareJobElement(env),
        "LMI_AssociatedSoftwareJobMethodResult" : \
                LMI_AssociatedSoftwareJobMethodResult(env),
        "LMI_OwningSoftwareJobElement"    : LMI_OwningSoftwareJobElement(env),
        "LMI_SoftwareIdentityFileCheck"   : LMI_SoftwareIdentityFileCheck(env),
        "LMI_SoftwareIdentityChecks"      : LMI_SoftwareIdentityChecks(env)
    }

    # Initialization of indication manager -- running in separate thread as
    # daemon. That means it does not have to be cleaned up.
    im = IndicationManager.get_instance(
            env, "Software", "root/cimv2", queue=Queue())
    JobManager.register_filters("LMI_SoftwareInstallationJob", im)
    JobManager.register_filters("LMI_SoftwareVerificationJob", im)

    return providers

def authorize_filter(env, fltr, class_name, op, owner):
    """
    CIMOM callback.

    It asks us to verify whether this filter is allowed.

    :param fltr: (``String``) Contains the filter that must be authorized. 
    :param class_name: (``String``) Contains the class name extracted
        from the filter FROM clause. 
    :param op: The name of the class for which monitoring is required.
        Only the namespace part is set if className is a process indication.
    :param owner The owner argument is the destination owner. 
    """
    IndicationManager.get_instance().authorize_filter(
            env, fltr, class_name, op, owner)

def activate_filter(env, fltr, class_name, class_path, first_activation):
    """
    CIMOM callback.
    
    It ask us to begin monitoring a resource. The function shall begin
    monitoring the resource according to the filter express only.

    :param fltr: (``String``) The filter argument contains the filter
        specification for this subscription to become active. 
    :param class_name: (``String``) The class name extracted from the filter
        FROM clause. 
    :param class_path: (``CIMInstanceName``) The name of the class for which
        monitoring is required. Only the namespace part is set if eventType
        is a process indication. 
    :param first_activation: (``bool``) Set to true if this is the first
        filter for className. 
    """
    IndicationManager.get_instance().activate_filter(
            env, fltr, class_name, class_path, first_activation)

def deactivate_filter(env, fltr, class_name, class_path, last_activation):
    """
    CIMOM callback.

    Informs us that monitoring using this filter should stop.

    :param fltr: (``String``) The filter argument contains the filter
        specification for this subscription to become active. 
    :param class_name: (``String``) The class name extracted from the filter
        FROM clause. 
    :param class_path: (``CIMInstanceName``) class_path The name of the class
        for which monitoring is required. Only the namespace part is set
        if className is a process indication. 
    :last_activation: (``bool``) Set to true if this is the last filter for
        className. 
    """
    IndicationManager.get_instance().deactivate_filter(
            env, fltr, class_name, class_path, last_activation)

def enable_indications(env):
    """
    CIMOM callback.

    Tells us that indications can now be generated. The MB is now prepared
    to process indications. The function is normally called by the MB after
    having done its intialization and processing of persistent subscription
    requests.
    """
    IndicationManager.get_instance().enable_indications(env)

def disable_indications(env):
    """
    CIMOM callback.

    Tells us that we should stop generating indications. MB will not accept any
    indications until enabled again. The function is normally called when the
    MB is shutting down indication services either temporarily or permanently.
    """
    IndicationManager.get_instance().disable_indications(env)

def can_unload(_env):
    """
    Says, whether providers can be unloaded.
    """
    return True

def shutdown(_env):
    """
    Release resources upon cleanup.
    """
    if YumDB.isInstantiated():
        YumDB.get_instance().clean_up()