aboutsummaryrefslogtreecommitdiffstats
path: root/heatbridge/heatbridge/OpenstackManager.py
blob: 07eddc71accb22668e0c1e2f6f4a092fc1f32ec0 (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
from heatclient.v1.client import Client as HeatClient;
from novaclient.v2.client import Client as NovaClient;
from cinderclient.v1.client import Client as CinderClient;
from glanceclient.v2.client import Client as GlanceClient;
from neutronclient.v2_0.client import Client as NeutronClient;
import os_client_config
import logging

class OpenstackManager:
    """OpenstackManager manages the connection state and interaction between an openstack cloud and the heatbridge."""

    #this holds the session of the openstack clients
    __heat_client = None;
    __nova_client = None;
    __cinder_client = None;
    __glance_client = None;
    __neutron_client = None;
    __auth_resp = None;

    def __init__(self, identity_url, context):
        """ OpenstackManager

        `identity_url` Base identity_url of the identity server
        'context' Instance of OpenstackContext
        """
        self.openstack_context = context;
        self.identity_url = identity_url;
        self.authenticate(context.username, context.password, context.tenant, context.region)
        logging.basicConfig(level=logging.DEBUG)

    def authenticate(self, username, password, tenant, region):
        """ Authenticate to openstack env

        `username` username to authenticate to openstack

        `password` password to send

        `tenant` tenant to authenticate under

        `region` region to authenticate under
        """
        self.__heat_client = os_client_config.make_client('orchestration',
            auth_url=self.identity_url,
            username=username,
            password=password,
            project_id=tenant,
            region_name=region);
        self.__nova_client = os_client_config.make_client('compute',
            auth_url=self.identity_url,
            username=username,
            password=password,
            project_id=tenant,
            region_name=region);
        self.__cinder_client = os_client_config.make_client('volume',
            auth_url=self.identity_url,
            username=username,
            password=password,
            project_id=tenant,
            region_name=region);
        self.__glance_client = os_client_config.make_client('image',
            auth_url=self.identity_url,
            username=username,
            password=password,
            project_id=tenant,
            region_name=region);
        self.__neutron_client = os_client_config.make_client('network',
            auth_url=self.identity_url,
            username=username,
            password=password,
            project_id=tenant,
            region_name=region);
        #this next line is needed because for v2 apis that are after a certain release stopped providing version info in keytone url but rackspace did not
        self.__neutron_client.action_prefix = "";
        self.__auth_resp = True;

    def get_stack(self, stack_id):
        self.__check_authenticated()
        #: :type client: HeatClient
        client = self.__heat_client
        stack = client.stacks.get(stack_id)
        return stack.to_dict();

    def get_stack_resources(self, stack_id):
        self.__check_authenticated()
        #: :type client: HeatClient
        client = self.__heat_client;
        stack_resources =  client.resources.list(stack_id);
        stack_resources_dict = map(lambda x:x.to_dict(),stack_resources)
        return stack_resources_dict;

    def get_server_volumes(self, server_id):
        self.__check_authenticated()
        #: :type client: NovaClient
        client = self.__nova_client;
        server_volumes = client.volumes.get_server_volumes(server_id);
        server_volumes_dict = map(lambda x:x.to_dict(),server_volumes)
        return server_volumes_dict;

    def get_server_interfaces(self, server_id):
        self.__check_authenticated()
        #: :type client: NovaClient
        client = self.__nova_client;
        server_interfaces = client.virtual_interfaces.list(server_id);
        server_interfaces_dict = map(lambda x:x.to_dict(),server_interfaces)
        return server_interfaces_dict;

    def get_volume_info(self, volume_id):
        self.__check_authenticated()
        #: :type client: CinderClient
        client = self.__cinder_client;
        volume_info = client.volumes.get(volume_id);
        return volume_info.to_dict();

    def get_server_info(self, server_id):
        self.__check_authenticated()
        #: :type client: NovaClient
        client = self.__nova_client;
        server_info = client.servers.get(server_id);
        return server_info.to_dict();

    def get_image_info(self, image_id):
        self.__check_authenticated()
        #: :type client: GlanceClient
        client = self.__glance_client;
        image_info = client.images.get(image_id);
        return image_info;

    def get_flavor_info(self, flavor_id):
        self.__check_authenticated()
        #: :type client: NovaClient
        client = self.__nova_client;
        flavor_info = client.flavors.get(flavor_id);
        return flavor_info.to_dict();

    def get_port_info(self, port_id):
        self.__check_authenticated()
        #: :type client: NeutronClient
        client = self.__neutron_client;
        port_info = client.show_port(port_id);
        return port_info;

    def __check_authenticated(self):
        if self.__auth_resp == None:
            raise AssertionError('__auth_resp should exist before calling operation')