Merge "Use the aarch64 image for functest"
[releng.git] / modules / opnfv / deployment / fuel / adapter.py
1 ##############################################################################
2 # Copyright (c) 2017 Ericsson AB and others.
3 # Author: Jose Lausuch (jose.lausuch@ericsson.com)
4 #         George Paraskevopoulos (geopar@intracom-telecom.com)
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11
12 from opnfv.deployment import manager
13 from opnfv.utils import opnfv_logger as logger
14 from opnfv.utils import ssh_utils
15
16 logger = logger.Logger("FuelAdapter").getLogger()
17
18
19 class FuelAdapter(manager.DeploymentHandler):
20
21     def __init__(self, installer_ip, installer_user, installer_pwd):
22         super(FuelAdapter, self).__init__(installer='fuel',
23                                           installer_ip=installer_ip,
24                                           installer_user=installer_user,
25                                           installer_pwd=installer_pwd,
26                                           pkey_file=None)
27
28     def _get_clusters(self):
29         environments = []
30         output = self.runcmd_fuel_env()
31         lines = output.rsplit('\n')
32         if len(lines) < 2:
33             logger.info("No environments found in the deployment.")
34             return None
35         else:
36             fields = lines[0].rsplit(' | ')
37
38             index_id = -1
39             index_status = -1
40             index_name = -1
41             index_release_id = -1
42
43             for i in range(len(fields) - 1):
44                 if "id" in fields[i]:
45                     index_id = i
46                 elif "status" in fields[i]:
47                     index_status = i
48                 elif "name" in fields[i]:
49                     index_name = i
50                 elif "release_id" in fields[i]:
51                     index_release_id = i
52
53             # order env info
54             for i in range(2, len(lines) - 1):
55                 fields = lines[i].rsplit(' | ')
56                 dict = {"id": fields[index_id].strip(),
57                         "status": fields[index_status].strip(),
58                         "name": fields[index_name].strip(),
59                         "release_id": fields[index_release_id].strip()}
60                 environments.append(dict)
61
62         return environments
63
64     def nodes(self, options=None):
65         nodes = []
66         cmd = 'fuel node'
67         output = self.installer_node.run_cmd(cmd)
68         lines = output.rsplit('\n')
69         if len(lines) < 2:
70             logger.info("No nodes found in the deployment.")
71             return None
72         else:
73             # get fields indexes
74             fields = lines[0].rsplit(' | ')
75
76             index_id = -1
77             index_status = -1
78             index_name = -1
79             index_cluster = -1
80             index_ip = -1
81             index_mac = -1
82             index_roles = -1
83             index_online = -1
84
85             for i in range(0, len(fields) - 1):
86                 if "id" in fields[i]:
87                     index_id = i
88                 elif "status" in fields[i]:
89                     index_status = i
90                 elif "name" in fields[i]:
91                     index_name = i
92                 elif "cluster" in fields[i]:
93                     index_cluster = i
94                 elif "ip" in fields[i]:
95                     index_ip = i
96                 elif "mac" in fields[i]:
97                     index_mac = i
98                 elif "roles " in fields[i]:
99                     index_roles = i
100                 elif "online" in fields[i]:
101                     index_online = i
102
103             # order nodes info
104             for i in range(2, len(lines) - 1):
105                 fields = lines[i].rsplit(' | ')
106
107                 id = fields[index_id].strip(),
108                 ip = fields[index_ip].strip()
109                 status_node = fields[index_status].strip()
110                 name = fields[index_name].strip()
111                 roles = fields[index_roles].strip()
112
113                 dict = {"cluster": fields[index_cluster].strip(),
114                         "mac": fields[index_mac].strip(),
115                         "online": fields[index_online].strip()}
116
117                 if status_node == 'ready':
118                     status = manager.Node.STATUS_OK
119                     proxy = {'ip': self.installer_ip,
120                              'username': self.installer_user,
121                              'password': self.installer_pwd}
122                     ssh_client = ssh_utils.get_ssh_client(hostname=ip,
123                                                           username='root',
124                                                           proxy=proxy)
125                 else:
126                     status = manager.Node.STATUS_INACTIVE
127                     ssh_client = None
128
129                 node = manager.Node(
130                     id, ip, name, status, roles, ssh_client, dict)
131                 nodes.append(node)
132
133                 # TODO: Add support for Fuel cluster selection
134                 '''
135                 if options and options['cluster']:
136                     if fields[index_cluster].strip() == options['cluster']:
137                 '''
138
139         return nodes
140
141     def get_openstack_version(self):
142         cmd = 'source openrc;nova-manage version 2>/dev/null'
143         version = None
144         for node in self.nodes:
145             if 'controller' in node.get_attribute('roles'):
146                 version = node.run_cmd(cmd)
147                 break
148         return version
149
150     def get_sdn_version(self):
151         cmd = "apt-cache show opendaylight|grep Version|sed 's/^.*\: //'"
152         version = None
153         for node in self.nodes:
154             if 'controller' in node.get_attribute('roles'):
155                 odl_version = node.run_cmd(cmd)
156                 if odl_version:
157                     version = 'OpenDaylight ' + odl_version
158                 break
159         return version
160
161     def get_deployment_status(self):
162         cmd = 'fuel env|grep operational'
163         result = self.installer_node.run_cmd(cmd)
164         if result is None or len(result) == 0:
165             return 'failed'
166         else:
167             return 'active'