/
libvirt_instance_adapter.h
113 lines (95 loc) · 3.59 KB
/
libvirt_instance_adapter.h
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
/*
* Copyright (c) 2015 Codilime
*/
#ifndef SRC_VNSW_AGENT_OPER_LIBVIRT_INSTANCE_ADAPTER_H_
#define SRC_VNSW_AGENT_OPER_LIBVIRT_INSTANCE_ADAPTER_H_
#include <tbb/tbb.h>
#include <libvirt/libvirt.h>
#include <boost/uuid/uuid_io.hpp>
#include <pugixml/pugixml.hpp>
#include <map>
#include <string>
#include "oper/instance_manager_adapter.h"
#include "oper/service_instance.h"
#include "oper/instance_task.h"
class InstanceTask;
class LibvirtInstanceAdapter : public InstanceManagerAdapter {
public:
LibvirtInstanceAdapter(Agent *agent, const std::string &libvirt_conn_addr)
: agent_(agent), libvirt_conn_addr_(libvirt_conn_addr), conn_(NULL) {}
~LibvirtInstanceAdapter();
InstanceTask *CreateStartTask(const ServiceInstance::Properties &props,
bool update);
InstanceTask *CreateStopTask(const ServiceInstance::Properties &props);
bool isApplicable(const ServiceInstance::Properties &props);
class DomainStartTask : public InstanceTaskMethod {
public:
DomainStartTask(LibvirtInstanceAdapter *parent_adapter,
const ServiceInstance::Properties &props,
bool update)
: parent_adapter_(parent_adapter), si_properties_(props),
update_(update) {}
bool Run();
void Stop() {}
void Terminate() {}
bool IsSetup() { return true; }
const std::string &cmd() const {
static const std::string cmdstr =
"libvirt domain start task";
return cmdstr;
}
int cmd_type() const {
return START;
}
private:
std::string XmlConf();
static void DomainXMLAssignUUID(
const std::string &libvirt_conf_str,
const pugi::xml_document &libvirt_xml_conf);
void DomainXMLSetInterfaceData(
const pugi::xml_document &libvirt_xml_conf,
const std::string &dom_uuid);
static void DomainXMLAddInterface(
pugi::xml_node *devices_node,
const std::string &mac_addr,
const std::string &intf_name);
static bool CreateTAPInterfaces(const std::string &dom_uuid);
LibvirtInstanceAdapter *parent_adapter_;
const ServiceInstance::Properties &si_properties_;
const bool update_;
};
class DomainStopTask : public InstanceTaskMethod {
public:
DomainStopTask(LibvirtInstanceAdapter *parent_adapter,
const ServiceInstance::Properties &props)
: parent_adapter_(parent_adapter), si_properties_(props) {}
bool Run();
void Stop() {}
void Terminate() {}
bool IsSetup() { return true; }
const std::string &cmd() const {
static const std::string cmdstr =
"libvirt domain stop task";
return cmdstr;
}
int cmd_type() const {
return STOP;
}
private:
LibvirtInstanceAdapter *parent_adapter_;
const ServiceInstance::Properties &si_properties_;
};
private:
bool EnsureConnected();
void CloseConnection();
void EnsureDestroyed(const std::string &dom_uuid_str,
const ServiceInstance::Properties &si_properties);
void UnregisterInterfaces(const ServiceInstance::Properties &si_properties);
bool RegisterInterfaces(const ServiceInstance::Properties &si_properties);
static std::string GenIntfName(const std::string &dom_uuid, char type);
Agent *agent_;
std::string libvirt_conn_addr_;
virConnectPtr conn_;
static tbb::mutex conn_mutex_;
};
#endif // SRC_VNSW_AGENT_OPER_LIBVIRT_INSTANCE_ADAPTER_H_