summaryrefslogtreecommitdiff
path: root/modules/CIAO/DAnCE/TargetManager/DomainDataManager.h
blob: 42986d94a80a03c02adb3e97cf7113603884c8e8 (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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
// $Id$
//===============================================================
/**
 * @file DomainDataManager.h
 *
 * @brief Maintains the Domain Information
 *
 * It contains the entire Domain information. Both the
 * initial domain as well as the current available domain.
 *
 * @author Nilabja Roy nilabjar@dre.vanderbilt.edu
 */
//===============================================================
#ifndef DOMAIN_DATA_MGRH
#define DOMAIN_DATA_MGRH

#include "Deployment/Deployment_TargetDataC.h"
#include "Deployment/Deployment_TargetManagerC.h"

namespace DAnCE
{
  /**
   * @class DomainDataManager
   *
   * @brief Responsible for maintaining the Domain Information
   *
   * It maintains both the Current Domain Information as well
   * as the Initial domain at full capacity.
   */
  class DomainDataManager
  {

  public :
    /**
     * @brief     This function is called by the other classes to update
     *            current domain data.
     * @param     elements The string sequence of elements
     *            being updated
     * @param     domainSubset The subset of the actual Domain to be updated
     * @param     updateKind Specifies the update type eg. add, delete, update
     *
     */
    int update_domain (const ::CORBA::StringSeq & elements,
                       const ::Deployment::Domain & domainSubset,
                       ::Deployment::DomainUpdateKind updateKind);
    /**
     * @brief        This function is called from the Executor code
     *               to get the Original Domain data.
     * @return       Domain* The Initial Domain
     */
    ::Deployment::Domain* get_initial_domain (void);

    /**
     * @brief       This function is called from the Executor code
     *              to get the Current Domain data.
     * @return      Domain* The Current Domain
     */
    ::Deployment::Domain* get_current_domain (void);

    /**
     * @brief returns the sequence of node managers
     * object reference
     */
    ::Deployment::ResourceCommitmentManager_ptr
    commitResources (const ::Deployment::ResourceAllocations & resources);

    /**
     * @brief The function releases the resources held by a plan
     */
    void releaseResources (const ::Deployment::ResourceCommitmentManager_ptr manager);

    /**
     * @brief The function allocates resources specified in the
     * parameter
     *
     * This function is for the ResourceCommitmentManager
     *
     */
    void commitResourceAllocation (
                                   const ::Deployment::ResourceAllocations & resources);

    /**
     * @brief The function releases resources specified in the
     * parameter
     *
     * This function is for the ResourceCommitmentManager
     *
     */
    void releaseResourceAllocation (
                                    const ::Deployment::ResourceAllocations & resources);

    /**
     * @brief Initializing DomainDataManager
     *
     * This function inits the DomainDataManager
     *
     */
    void init (CORBA::ORB_ptr orb,
               ::Deployment::TargetManager_ptr target,
               const ACE_TCHAR *domain_name);

  private:
    /// The different action that can take place
    enum  Action {commit , release};

    /**
     * @brief   It will read the initial Domain data from
     *          XML files.
     */
    int readin_domain_data (void);

    /**
     * @brief Match the deployed resources to the
     * available resource
     */
    void match_requirement_resource (
                                     ::Deployment::InstanceResourceDeploymentDescriptions deployed,
                                     ::Deployment::Resources& available);

    /**
     * @brief Match the properties of a Requirement to the
     * properties of available resource
     * @param deployed The deployed Properties
     * @param available The available Properties
     */
    void match_properties (
                           ::Deployment::Properties deployed,
                           ::Deployment::SatisfierProperties& available);


    /**
     * @brief Either commits or releases the given resource
     * based on the current Action set.
     * @param deployed ::Deployment::Property is the resource
     * to be commited/released
     * @param available ::Deployment::SatisfierProperty is the
     * available resource from which committed/released.
     * @exception  ::Deployment::ResourceNotAvailable thrown
     *             when the deployed resources exceeds
     *             the available resource.
     */
    void commit_release_resource (  ::Deployment::Property & deployed,
                                    ::Deployment::SatisfierProperty & available);

    /**
     * @brief This function calls all NM and gives them
     * the sub-domain
     */
    int call_all_node_managers (void);

    /**
     * @brief This function add new elements to the
     * already existing domain
     *
     * @param domain Deployment::Domain contians the new
     * elements
     */
    int add_to_domain (const ::Deployment::Domain& domain);

    /**
     *  @brief This function deletes elements from the domain
     *
     *  @param domain ::Deployment::Domain contains the new elements
     *  in the domain
     */
    int delete_from_domain (const ::Deployment::Domain& domain);

    /**
     *  @brief This function intimates the planner about a domain
     *  change
     *
     *  @param domain ::Deployment::Domain contains the new elements
     *  in the domain
     */
    int intimate_planner (const ::Deployment::Domain& domain);

    /**
     *  @brief This function finds a new node in the initial_domain
     *
     *  @param node The name of the node which is to be searched
     */

    bool find_in_initial_domain (const char* node_name,
                                 ::Deployment::Node& node);
    /**
     *  @brief This function finds a new node in the proviosiond_domain
     *
     *  @param node The name of the node which is to be searched
     */
    bool find_in_provisioned_domain (const char* node_name,
                                     ::Deployment::Node& node);

    /**
     *  @brief updates the node status by reading it from a file
     */
    bool update_node_status ();

    /**
     * @function find_resource
     * @brief It finds the Resource structure which is respresents the
     * ResourceAllocation
     */
    ::Deployment::Resource& find_resource (
                                           const ::Deployment::ResourceAllocation& resource);

    int commit_release_RA (
                           const ::Deployment::ResourceAllocations& resources);

    /// The ORB pointer
    CORBA::ORB_var orb_;

    /// The Deployment Configuration
    //      CIAO::Deployment_Configuration deployment_config_;

    /// The Initial Domain - contains resources
    /// at total capacity
    ::Deployment::Domain initial_domain_;

    /// The Current Domain - contains resources at current capacity
    ::Deployment::Domain current_domain_;

    /// The Target Manager Context
    ::Deployment::TargetManager_var target_mgr_;

    /**
     * The static provisioned Domain data
     */
    ::Deployment::Domain provisioned_data_;

    /// temporary domain used in commit/release to
    /// guard against exceptions
    ::Deployment::Domain temp_provisioned_data_;

    /// The current action
    Action current_action_;
  };

  typedef ACE_Singleton <DomainDataManager, ACE_SYNCH_RECURSIVE_MUTEX>
  DomainDataManager_Singleton;
#define DOMAIN_DATA_MANAGER DomainDataManager_Singleton::instance ()
} // CIAO

#endif /* DOMAIN_DATA_MGRH */