File: VirtualMachineHook.h

package info (click to toggle)
opennebula 3.4.1-3.1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 9,680 kB
  • sloc: cpp: 35,288; ruby: 24,818; sh: 5,212; java: 4,001; xml: 1,163; yacc: 821; sql: 252; lex: 216; ansic: 192; makefile: 91; python: 46
file content (178 lines) | stat: -rw-r--r-- 6,625 bytes parent folder | download
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
/* -------------------------------------------------------------------------- */
/* Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org)             */
/*                                                                            */
/* Licensed under the Apache License, Version 2.0 (the "License"); you may    */
/* not use this file except in compliance with the License. You may obtain    */
/* a copy of the License at                                                   */
/*                                                                            */
/* http://www.apache.org/licenses/LICENSE-2.0                                 */
/*                                                                            */
/* Unless required by applicable law or agreed to in writing, software        */
/* distributed under the License is distributed on an "AS IS" BASIS,          */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   */
/* See the License for the specific language governing permissions and        */
/* limitations under the License.                                             */
/* -------------------------------------------------------------------------- */

#ifndef VIRTUAL_MACHINE_HOOK_H_
#define VIRTUAL_MACHINE_HOOK_H_

#include <vector>
#include <string>

#include "Hook.h"
#include "VirtualMachine.h"

using namespace std;

/**
 *  This class is general VM Allocate Hook that executes a command locally
 *  when the VM is inserted in the database. The VirtualMachine object is
 *  looked
 */
class VirtualMachineAllocateHook : public Hook
{
public:
    // -------------------------------------------------------------------------
    // Init a LOCAL hook of ALLOCATE type
    // -------------------------------------------------------------------------
    VirtualMachineAllocateHook(const string& name,
                               const string& cmd,
                               const string& args):
        Hook(name, cmd, args, Hook::ALLOCATE, false){};

    ~VirtualMachineAllocateHook(){};

    // -------------------------------------------------------------------------
    // Hook methods
    // -------------------------------------------------------------------------

    void do_hook(void *arg);
};

/**
 *  This class provides basic functionality to store VM states for state Hooks.
 *  The state Map is shared by all the State hooks. A maintenance hook that
 *  updates the map should be added.
 */
class VirtualMachineStateMapHook: public Hook
{
public:
    virtual void do_hook(void *arg) = 0;

protected:
    // -------------------------------------------------------------------------
    // Init the Map
    // -------------------------------------------------------------------------
    VirtualMachineStateMapHook(const string& name,
                           const string& cmd,
                           const string& args,
                           bool          remote):
        Hook(name, cmd, args, Hook::UPDATE | Hook::ALLOCATE, remote){};

    virtual ~VirtualMachineStateMapHook(){};

    // -------------------------------------------------------------------------
    // Functions to handle the VM state map
    // -------------------------------------------------------------------------
    /**
     *  Gets the state associated to the VM
     *    @param id of the VM
     *    @param lcm_state (previous) of the VM
     *    @return 0 if the previous state for the VM has been recorded
     */
    int get_state(int id,
                  VirtualMachine::LcmState &lcm_state,
                  VirtualMachine::VmState  &vm_state);

    /**
     *  Updates the state associated to the VM
     *    @param id of the VM
     *    @param lcm_state (current) of the VM
     */
    void update_state (int                      id,
                       VirtualMachine::LcmState lcm_state,
                       VirtualMachine::VmState  vm_state);
private:

    struct VmStates
    {
        VmStates(VirtualMachine::LcmState _lcm, VirtualMachine::VmState _vm):
            lcm(_lcm), vm(_vm){};

        VirtualMachine::LcmState lcm;
        VirtualMachine::VmState  vm;
    };

    /**
     *  The state Map for the VMs
     */
    static map<int,VmStates> vm_states;
};

/**
 *  This class is a general VM State Hook that executes a command locally or
 *  remotelly when the VM gets into a given state (one shot). The VirtualMachine
 *  object is looked when the hook is invoked.
 */
class VirtualMachineStateHook : public VirtualMachineStateMapHook
{
public:
    // -------------------------------------------------------------------------
    // -------------------------------------------------------------------------
    /**
     *  Creates a VirtualMachineStateHook
     *    @param name of the hook
     *    @param cmd for the hook
     *    @param args for the hook
     *    @param _state the hook will be executed when the VM enters this state
     *    @param remote the hook will be executed on the target resource
     */
    VirtualMachineStateHook(const string&            name,
                            const string&            cmd,
                            const string&            args,
                            bool                     remote,
                            VirtualMachine::LcmState _lcm,
                            VirtualMachine::VmState  _vm):
        VirtualMachineStateMapHook(name,cmd,args,remote), lcm(_lcm), vm(_vm){};

    ~VirtualMachineStateHook(){};

    // -------------------------------------------------------------------------
    // Hook methods
    // -------------------------------------------------------------------------
    void do_hook(void *arg);

private:
    /**
     *  The target LCM state
     */
    VirtualMachine::LcmState lcm;

    /**
     *  The target DM state
     */
    VirtualMachine::VmState  vm;
};

/**
 *  This class implements a state Map updater, one hook of this type should be
 *  added in order to mantain the VM state map.
 */
class VirtualMachineUpdateStateHook : public VirtualMachineStateMapHook
{
public:
    // -------------------------------------------------------------------------
    // -------------------------------------------------------------------------
    VirtualMachineUpdateStateHook():
        VirtualMachineStateMapHook("","","",false){};

    ~VirtualMachineUpdateStateHook(){};

    // -------------------------------------------------------------------------
    // Hook methods
    // -------------------------------------------------------------------------
    void do_hook(void *arg);
};

#endif