f4c724fbf1
A new Shipyard site statuses API and CLI supporting nodes provisoning status and node power state. This API can be further developed to support new status requirements by expanding the filters option. Change-Id: I620aefd82d4a17b616f3f253265605e519506257
218 lines
6.0 KiB
Python
218 lines
6.0 KiB
Python
# Copyright 2018 AT&T Intellectual Property. All other rights reserved.
|
|
#
|
|
# 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.
|
|
from unittest import mock
|
|
|
|
from shipyard_airflow.control.base import ShipyardRequestContext
|
|
from shipyard_airflow.control.helpers.status_helper import (
|
|
StatusHelper)
|
|
import shipyard_airflow.control.helpers.status_helper as sh
|
|
|
|
|
|
CTX = ShipyardRequestContext()
|
|
|
|
MACH_STATUS_DICT = {
|
|
'nodes_provision_status': [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'status': 'READY'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'status': 'DEPLOYING'
|
|
}
|
|
]
|
|
}
|
|
|
|
MACH_POWERSTATE_DICT = {
|
|
'machines_powerstate': [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'power_state': 'ON'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'power_state': 'ON'
|
|
}
|
|
]
|
|
}
|
|
|
|
STATUS_LIST = [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'status': 'READY'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'status': 'DEPLOYING'
|
|
}
|
|
]
|
|
|
|
MACH_PS_LIST = [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'power_state': 'ON'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'power_state': 'ON'
|
|
}
|
|
]
|
|
|
|
|
|
ALL_STATUSES_DICT = {
|
|
'nodes_provision_status': [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'status': 'READY'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'status': 'DEPLOYING'
|
|
}
|
|
],
|
|
'machines_powerstate': [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'power_state': 'ON'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'power_state': 'ON'
|
|
}
|
|
]
|
|
}
|
|
|
|
NODE_LIST = [
|
|
{
|
|
'hostname': 'abc.xyz.com',
|
|
'memory': 12800,
|
|
'cpu_count': 32,
|
|
'status_name': 'READY',
|
|
'boot_mac': '08:00:27:76:c1:2c',
|
|
'power_state': 'ON',
|
|
'power_address': 'dummy',
|
|
'boot_ip': '1.2.3.4'
|
|
},
|
|
{
|
|
'hostname': 'def.xyz.com',
|
|
'memory': 12800,
|
|
'cpu_count': 32,
|
|
'status_name': 'DEPLOYING',
|
|
'boot_mac': '08:00:27:76:c1:2e',
|
|
'power_state': 'ON',
|
|
'power_address': 'dummy',
|
|
'boot_ip': '1.2.3.5'
|
|
}
|
|
]
|
|
|
|
NODE_PROVISION_STATUS = 'nodes-provision-status'
|
|
MACHINES_POWER_STATE = 'machines-power-state'
|
|
|
|
|
|
def test_construct_status_helper():
|
|
"""
|
|
Creates a status helper, tests that the context
|
|
is passed to the sub-helper
|
|
"""
|
|
helper = StatusHelper(CTX)
|
|
assert helper.ctx == CTX
|
|
|
|
|
|
@mock.patch(
|
|
'shipyard_airflow.control.helpers.status_helper.get_machines_powerstate',
|
|
return_value=MACH_POWERSTATE_DICT)
|
|
@mock.patch(
|
|
'shipyard_airflow.control.helpers.status_helper'
|
|
'.get_nodes_provision_status',
|
|
return_value=MACH_STATUS_DICT)
|
|
def test_get_site_statuses(patch1, patch2):
|
|
"""
|
|
Testing status according to filter values
|
|
"""
|
|
helper = StatusHelper(CTX)
|
|
|
|
helper.drydock = 'Dummy'
|
|
# test with filter for machine provision status
|
|
ret_mach_status = helper.get_site_statuses([NODE_PROVISION_STATUS])
|
|
prov_status_list = ret_mach_status.get('nodes_provision_status')
|
|
|
|
assert STATUS_LIST == sorted(prov_status_list, key=lambda x: x['hostname'])
|
|
|
|
# test with filter for machine power state
|
|
ret_mach_powerstate = helper.get_site_statuses([MACHINES_POWER_STATE])
|
|
mach_ps_list = ret_mach_powerstate.get('machines_powerstate')
|
|
|
|
assert MACH_PS_LIST == sorted(mach_ps_list, key=lambda x: x['hostname'])
|
|
|
|
# test without filters
|
|
ret_wo_filters = helper.get_site_statuses()
|
|
psl_wo = ret_wo_filters.get('nodes_provision_status')
|
|
|
|
assert STATUS_LIST == sorted(psl_wo, key=lambda x: x['hostname'])
|
|
|
|
mpl_wo = ret_wo_filters.get('machines_powerstate')
|
|
|
|
assert MACH_PS_LIST == sorted(mpl_wo, key=lambda x: x['hostname'])
|
|
|
|
# test with both filters
|
|
all_filters = [NODE_PROVISION_STATUS, MACHINES_POWER_STATE]
|
|
ret_all_statuses = helper.get_site_statuses(all_filters)
|
|
psl_with = ret_all_statuses.get('nodes_provision_status')
|
|
|
|
assert STATUS_LIST == sorted(psl_with, key=lambda x: x['hostname'])
|
|
|
|
mpl_with = ret_all_statuses.get('machines_powerstate')
|
|
|
|
assert MACH_PS_LIST == sorted(mpl_with, key=lambda x: x['hostname'])
|
|
|
|
|
|
@mock.patch("drydock_provisioner.drydock_client.client.DrydockClient")
|
|
def test_get_machines_powerstate(drydock):
|
|
"""
|
|
Tests the functionality of the get_machines_powerstate method
|
|
"""
|
|
drydock.get_nodes.return_value = NODE_LIST
|
|
mach_ps_dict = sh.get_machines_powerstate(drydock)
|
|
actual = mach_ps_dict.get('machines_powerstate')
|
|
expected = MACH_POWERSTATE_DICT.get('machines_powerstate')
|
|
|
|
assert actual == sorted(expected, key=lambda x: x['hostname'])
|
|
|
|
|
|
@mock.patch("drydock_provisioner.drydock_client.client.DrydockClient")
|
|
def test_get_nodes_provision_status(drydock):
|
|
"""
|
|
Tests the functionality of the get_nodes_provision_status method
|
|
"""
|
|
drydock.get_nodes.return_value = NODE_LIST
|
|
nodes_provision_status = sh.get_nodes_provision_status(drydock)
|
|
actual = nodes_provision_status.get('nodes_provision_status')
|
|
expected = MACH_STATUS_DICT.get('nodes_provision_status')
|
|
|
|
assert actual == sorted(expected, key=lambda x: x['hostname'])
|
|
|
|
|
|
def test__switcher():
|
|
"""
|
|
Tests the functionality of the _switcher() method
|
|
"""
|
|
helper = StatusHelper(CTX)
|
|
pns = "get_nodes_provision_status"
|
|
mps = "get_machines_powerstate"
|
|
actual_pns = helper._switcher(NODE_PROVISION_STATUS)
|
|
actual_mps = helper._switcher(MACHINES_POWER_STATE)
|
|
|
|
assert pns in str(actual_pns)
|
|
assert mps in str(actual_mps)
|