shipyard/src/bin/shipyard_airflow/tests/unit/control/test_status_helper.py
Smruti Soumitra Khuntia f4c724fbf1 A new Shipyard site statuses API and CLI
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
2018-07-31 09:16:36 +00:00

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)