|
Packit Service |
a04d08 |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
import base64
|
|
Packit Service |
11b429 |
import copy
|
|
Packit Service |
11b429 |
import json
|
|
Packit Service |
751c4a |
from contextlib import ExitStack
|
|
Packit Service |
751c4a |
from unittest import mock
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
import pytest
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
from cloudinit.sources import DataSourceOracle as oracle
|
|
Packit Service |
751c4a |
from cloudinit.sources import NetworkConfigSource
|
|
Packit Service |
751c4a |
from cloudinit.sources.DataSourceOracle import OpcMetadata
|
|
Packit Service |
751c4a |
from cloudinit.tests import helpers as test_helpers
|
|
Packit Service |
751c4a |
from cloudinit.url_helper import UrlError
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
DS_PATH = "cloudinit.sources.DataSourceOracle"
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# `curl -L http://169.254.169.254/opc/v1/vnics/` on a Oracle Bare Metal Machine
|
|
Packit Service |
a04d08 |
# with a secondary VNIC attached (vnicId truncated for Python line length)
|
|
Packit Service |
a04d08 |
OPC_BM_SECONDARY_VNIC_RESPONSE = """\
|
|
Packit Service |
a04d08 |
[ {
|
|
Packit Service |
a04d08 |
"vnicId" : "ocid1.vnic.oc1.phx.abyhqljtyvcucqkhdqmgjszebxe4hrb!!TRUNCATED||",
|
|
Packit Service |
a04d08 |
"privateIp" : "10.0.0.8",
|
|
Packit Service |
a04d08 |
"vlanTag" : 0,
|
|
Packit Service |
a04d08 |
"macAddr" : "90:e2:ba:d4:f1:68",
|
|
Packit Service |
a04d08 |
"virtualRouterIp" : "10.0.0.1",
|
|
Packit Service |
a04d08 |
"subnetCidrBlock" : "10.0.0.0/24",
|
|
Packit Service |
a04d08 |
"nicIndex" : 0
|
|
Packit Service |
a04d08 |
}, {
|
|
Packit Service |
a04d08 |
"vnicId" : "ocid1.vnic.oc1.phx.abyhqljtfmkxjdy2sqidndiwrsg63zf!!TRUNCATED||",
|
|
Packit Service |
a04d08 |
"privateIp" : "10.0.4.5",
|
|
Packit Service |
a04d08 |
"vlanTag" : 1,
|
|
Packit Service |
a04d08 |
"macAddr" : "02:00:17:05:CF:51",
|
|
Packit Service |
a04d08 |
"virtualRouterIp" : "10.0.4.1",
|
|
Packit Service |
a04d08 |
"subnetCidrBlock" : "10.0.4.0/24",
|
|
Packit Service |
a04d08 |
"nicIndex" : 0
|
|
Packit Service |
a04d08 |
} ]"""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# `curl -L http://169.254.169.254/opc/v1/vnics/` on a Oracle Virtual Machine
|
|
Packit Service |
a04d08 |
# with a secondary VNIC attached
|
|
Packit Service |
a04d08 |
OPC_VM_SECONDARY_VNIC_RESPONSE = """\
|
|
Packit Service |
a04d08 |
[ {
|
|
Packit Service |
a04d08 |
"vnicId" : "ocid1.vnic.oc1.phx.abyhqljtch72z5pd76cc2636qeqh7z_truncated",
|
|
Packit Service |
a04d08 |
"privateIp" : "10.0.0.230",
|
|
Packit Service |
a04d08 |
"vlanTag" : 1039,
|
|
Packit Service |
a04d08 |
"macAddr" : "02:00:17:05:D1:DB",
|
|
Packit Service |
a04d08 |
"virtualRouterIp" : "10.0.0.1",
|
|
Packit Service |
a04d08 |
"subnetCidrBlock" : "10.0.0.0/24"
|
|
Packit Service |
a04d08 |
}, {
|
|
Packit Service |
a04d08 |
"vnicId" : "ocid1.vnic.oc1.phx.abyhqljt4iew3gwmvrwrhhf3bp5drj_truncated",
|
|
Packit Service |
a04d08 |
"privateIp" : "10.0.0.231",
|
|
Packit Service |
a04d08 |
"vlanTag" : 1041,
|
|
Packit Service |
a04d08 |
"macAddr" : "00:00:17:02:2B:B1",
|
|
Packit Service |
a04d08 |
"virtualRouterIp" : "10.0.0.1",
|
|
Packit Service |
a04d08 |
"subnetCidrBlock" : "10.0.0.0/24"
|
|
Packit Service |
a04d08 |
} ]"""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
# Fetched with `curl http://169.254.169.254/opc/v1/instance/` (and then
|
|
Packit Service |
751c4a |
# truncated for line length)
|
|
Packit Service |
751c4a |
OPC_V2_METADATA = """\
|
|
Packit Service |
751c4a |
{
|
|
Packit Service |
751c4a |
"availabilityDomain" : "qIZq:PHX-AD-1",
|
|
Packit Service |
751c4a |
"faultDomain" : "FAULT-DOMAIN-2",
|
|
Packit Service |
751c4a |
"compartmentId" : "ocid1.tenancy.oc1..aaaaaaaao7f7cccogqrg5emjxkxmTRUNCATED",
|
|
Packit Service |
751c4a |
"displayName" : "instance-20200320-1400",
|
|
Packit Service |
751c4a |
"hostname" : "instance-20200320-1400",
|
|
Packit Service |
751c4a |
"id" : "ocid1.instance.oc1.phx.anyhqljtniwq6syc3nex55sep5w34qbwmw6TRUNCATED",
|
|
Packit Service |
751c4a |
"image" : "ocid1.image.oc1.phx.aaaaaaaagmkn4gdhvvx24kiahh2b2qchsicTRUNCATED",
|
|
Packit Service |
751c4a |
"metadata" : {
|
|
Packit Service |
751c4a |
"ssh_authorized_keys" : "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ truncated",
|
|
Packit Service |
751c4a |
"user_data" : "IyEvYmluL3NoCnRvdWNoIC90bXAvZm9v"
|
|
Packit Service |
751c4a |
},
|
|
Packit Service |
751c4a |
"region" : "phx",
|
|
Packit Service |
751c4a |
"canonicalRegionName" : "us-phoenix-1",
|
|
Packit Service |
751c4a |
"ociAdName" : "phx-ad-3",
|
|
Packit Service |
751c4a |
"shape" : "VM.Standard2.1",
|
|
Packit Service |
751c4a |
"state" : "Running",
|
|
Packit Service |
751c4a |
"timeCreated" : 1584727285318,
|
|
Packit Service |
751c4a |
"agentConfig" : {
|
|
Packit Service |
751c4a |
"monitoringDisabled" : true,
|
|
Packit Service |
751c4a |
"managementDisabled" : true
|
|
Packit Service |
751c4a |
}
|
|
Packit Service |
751c4a |
}"""
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
# Just a small meaningless change to differentiate the two metadatas
|
|
Packit Service |
751c4a |
OPC_V1_METADATA = OPC_V2_METADATA.replace("ocid1.instance", "ocid2.instance")
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.fixture
|
|
Packit Service |
751c4a |
def metadata_version():
|
|
Packit Service |
751c4a |
return 2
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.yield_fixture
|
|
Packit Service |
751c4a |
def oracle_ds(request, fixture_utils, paths, metadata_version):
|
|
Packit Service |
751c4a |
"""
|
|
Packit Service |
751c4a |
Return an instantiated DataSourceOracle.
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
This also performs the mocking required for the default test case:
|
|
Packit Service |
751c4a |
* ``_read_system_uuid`` returns something,
|
|
Packit Service |
751c4a |
* ``_is_platform_viable`` returns True,
|
|
Packit Service |
751c4a |
* ``_is_iscsi_root`` returns True (the simpler code path),
|
|
Packit Service |
751c4a |
* ``read_opc_metadata`` returns ``OPC_V1_METADATA``
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
(This uses the paths fixture for the required helpers.Paths object, and the
|
|
Packit Service |
751c4a |
fixture_utils fixture for fetching markers.)
|
|
Packit Service |
751c4a |
"""
|
|
Packit Service |
751c4a |
sys_cfg = fixture_utils.closest_marker_first_arg_or(
|
|
Packit Service |
751c4a |
request, "ds_sys_cfg", mock.MagicMock()
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
metadata = OpcMetadata(metadata_version, json.loads(OPC_V2_METADATA), None)
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + "._read_system_uuid", return_value="someuuid"):
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + "._is_platform_viable", return_value=True):
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + "._is_iscsi_root", return_value=True):
|
|
Packit Service |
751c4a |
with mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + ".read_opc_metadata",
|
|
Packit Service |
751c4a |
return_value=metadata,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
yield oracle.DataSourceOracle(
|
|
Packit Service |
751c4a |
sys_cfg=sys_cfg, distro=mock.Mock(), paths=paths,
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
class TestDataSourceOracle:
|
|
Packit Service |
751c4a |
def test_platform_info(self, oracle_ds):
|
|
Packit Service |
751c4a |
assert "oracle" == oracle_ds.cloud_name
|
|
Packit Service |
751c4a |
assert "oracle" == oracle_ds.platform_type
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_subplatform_before_fetch(self, oracle_ds):
|
|
Packit Service |
751c4a |
assert 'unknown' == oracle_ds.subplatform
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_platform_info_after_fetch(self, oracle_ds):
|
|
Packit Service |
751c4a |
oracle_ds._get_data()
|
|
Packit Service |
751c4a |
assert 'metadata (http://169.254.169.254/opc/v2/)' == \
|
|
Packit Service |
751c4a |
oracle_ds.subplatform
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize('metadata_version', [1])
|
|
Packit Service |
751c4a |
def test_v1_platform_info_after_fetch(self, oracle_ds):
|
|
Packit Service |
751c4a |
oracle_ds._get_data()
|
|
Packit Service |
751c4a |
assert 'metadata (http://169.254.169.254/opc/v1/)' == \
|
|
Packit Service |
751c4a |
oracle_ds.subplatform
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_secondary_nics_disabled_by_default(self, oracle_ds):
|
|
Packit Service |
751c4a |
assert not oracle_ds.ds_cfg["configure_secondary_nics"]
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.ds_sys_cfg(
|
|
Packit Service |
751c4a |
{"datasource": {"Oracle": {"configure_secondary_nics": True}}}
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_sys_cfg_can_enable_configure_secondary_nics(self, oracle_ds):
|
|
Packit Service |
751c4a |
assert oracle_ds.ds_cfg["configure_secondary_nics"]
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
class TestIsPlatformViable(test_helpers.CiTestCase):
|
|
Packit Service |
a04d08 |
@mock.patch(DS_PATH + ".util.read_dmi_data",
|
|
Packit Service |
a04d08 |
return_value=oracle.CHASSIS_ASSET_TAG)
|
|
Packit Service |
a04d08 |
def test_expected_viable(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""System with known chassis tag is viable."""
|
|
Packit Service |
a04d08 |
self.assertTrue(oracle._is_platform_viable())
|
|
Packit Service |
a04d08 |
m_read_dmi_data.assert_has_calls([mock.call('chassis-asset-tag')])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch(DS_PATH + ".util.read_dmi_data", return_value=None)
|
|
Packit Service |
a04d08 |
def test_expected_not_viable_dmi_data_none(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""System without known chassis tag is not viable."""
|
|
Packit Service |
a04d08 |
self.assertFalse(oracle._is_platform_viable())
|
|
Packit Service |
a04d08 |
m_read_dmi_data.assert_has_calls([mock.call('chassis-asset-tag')])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch(DS_PATH + ".util.read_dmi_data", return_value="LetsGoCubs")
|
|
Packit Service |
a04d08 |
def test_expected_not_viable_other(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""System with unnown chassis tag is not viable."""
|
|
Packit Service |
a04d08 |
self.assertFalse(oracle._is_platform_viable())
|
|
Packit Service |
a04d08 |
m_read_dmi_data.assert_has_calls([mock.call('chassis-asset-tag')])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
class TestNetworkConfigFromOpcImds:
|
|
Packit Service |
751c4a |
def test_no_secondary_nics_does_not_mutate_input(self, oracle_ds):
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = [{}]
|
|
Packit Service |
751c4a |
# We test this by using in a non-dict to ensure that no dict
|
|
Packit Service |
a04d08 |
# operations are used; failure would be seen as exceptions
|
|
Packit Service |
751c4a |
oracle_ds._network_config = object()
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def test_bare_metal_machine_skipped(self, oracle_ds, caplog):
|
|
Packit Service |
a04d08 |
# nicIndex in the first entry indicates a bare metal machine
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = json.loads(OPC_BM_SECONDARY_VNIC_RESPONSE)
|
|
Packit Service |
751c4a |
# We test this by using a non-dict to ensure that no dict
|
|
Packit Service |
a04d08 |
# operations are used
|
|
Packit Service |
751c4a |
oracle_ds._network_config = object()
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
751c4a |
assert 'bare metal machine' in caplog.text
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def test_missing_mac_skipped(self, oracle_ds, caplog):
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = json.loads(OPC_VM_SECONDARY_VNIC_RESPONSE)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
oracle_ds._network_config = {
|
|
Packit Service |
751c4a |
'version': 1, 'config': [{'primary': 'nic'}]
|
|
Packit Service |
751c4a |
}
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + ".get_interfaces_by_mac", return_value={}):
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
assert 1 == len(oracle_ds.network_config['config'])
|
|
Packit Service |
751c4a |
assert 'Interface with MAC 00:00:17:02:2b:b1 not found; skipping' in \
|
|
Packit Service |
751c4a |
caplog.text
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def test_missing_mac_skipped_v2(self, oracle_ds, caplog):
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = json.loads(OPC_VM_SECONDARY_VNIC_RESPONSE)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
oracle_ds._network_config = {
|
|
Packit Service |
751c4a |
'version': 2, 'ethernets': {'primary': {'nic': {}}}
|
|
Packit Service |
751c4a |
}
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + ".get_interfaces_by_mac", return_value={}):
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
assert 1 == len(oracle_ds.network_config['ethernets'])
|
|
Packit Service |
751c4a |
assert 'Interface with MAC 00:00:17:02:2b:b1 not found; skipping' in \
|
|
Packit Service |
751c4a |
caplog.text
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def test_secondary_nic(self, oracle_ds):
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = json.loads(OPC_VM_SECONDARY_VNIC_RESPONSE)
|
|
Packit Service |
751c4a |
oracle_ds._network_config = {
|
|
Packit Service |
751c4a |
'version': 1, 'config': [{'primary': 'nic'}]
|
|
Packit Service |
11b429 |
}
|
|
Packit Service |
751c4a |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'ens3'
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + ".get_interfaces_by_mac",
|
|
Packit Service |
751c4a |
return_value={mac_addr: nic_name}):
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# The input is mutated
|
|
Packit Service |
751c4a |
assert 2 == len(oracle_ds.network_config['config'])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
secondary_nic_cfg = oracle_ds.network_config['config'][1]
|
|
Packit Service |
751c4a |
assert nic_name == secondary_nic_cfg['name']
|
|
Packit Service |
751c4a |
assert 'physical' == secondary_nic_cfg['type']
|
|
Packit Service |
751c4a |
assert mac_addr == secondary_nic_cfg['mac_address']
|
|
Packit Service |
751c4a |
assert 9000 == secondary_nic_cfg['mtu']
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
assert 1 == len(secondary_nic_cfg['subnets'])
|
|
Packit Service |
a04d08 |
subnet_cfg = secondary_nic_cfg['subnets'][0]
|
|
Packit Service |
a04d08 |
# These values are hard-coded in OPC_VM_SECONDARY_VNIC_RESPONSE
|
|
Packit Service |
751c4a |
assert '10.0.0.231' == subnet_cfg['address']
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def test_secondary_nic_v2(self, oracle_ds):
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = json.loads(OPC_VM_SECONDARY_VNIC_RESPONSE)
|
|
Packit Service |
751c4a |
oracle_ds._network_config = {
|
|
Packit Service |
751c4a |
'version': 2, 'ethernets': {'primary': {'nic': {}}}
|
|
Packit Service |
11b429 |
}
|
|
Packit Service |
751c4a |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'ens3'
|
|
Packit Service |
751c4a |
with mock.patch(DS_PATH + ".get_interfaces_by_mac",
|
|
Packit Service |
751c4a |
return_value={mac_addr: nic_name}):
|
|
Packit Service |
751c4a |
oracle_ds._add_network_config_from_opc_imds()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# The input is mutated
|
|
Packit Service |
751c4a |
assert 2 == len(oracle_ds.network_config['ethernets'])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
secondary_nic_cfg = oracle_ds.network_config['ethernets']['ens3']
|
|
Packit Service |
751c4a |
assert secondary_nic_cfg['dhcp4'] is False
|
|
Packit Service |
751c4a |
assert secondary_nic_cfg['dhcp6'] is False
|
|
Packit Service |
751c4a |
assert mac_addr == secondary_nic_cfg['match']['macaddress']
|
|
Packit Service |
751c4a |
assert 9000 == secondary_nic_cfg['mtu']
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
assert 1 == len(secondary_nic_cfg['addresses'])
|
|
Packit Service |
a04d08 |
# These values are hard-coded in OPC_VM_SECONDARY_VNIC_RESPONSE
|
|
Packit Service |
751c4a |
assert '10.0.0.231' == secondary_nic_cfg['addresses'][0]
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
class TestNetworkConfigFiltersNetFailover(test_helpers.CiTestCase):
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def setUp(self):
|
|
Packit Service |
a04d08 |
super(TestNetworkConfigFiltersNetFailover, self).setUp()
|
|
Packit Service |
a04d08 |
self.add_patch(DS_PATH + '.get_interfaces_by_mac',
|
|
Packit Service |
a04d08 |
'm_get_interfaces_by_mac')
|
|
Packit Service |
a04d08 |
self.add_patch(DS_PATH + '.is_netfail_master', 'm_netfail_master')
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_ignore_bogus_network_config(self):
|
|
Packit Service |
a04d08 |
netcfg = {'something': 'here'}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_ignore_network_config_unknown_versions(self):
|
|
Packit Service |
a04d08 |
netcfg = {'something': 'here', 'version': 3}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_checks_v1_type_physical_interfaces(self):
|
|
Packit Service |
a04d08 |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'ens3'
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_addr: nic_name,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 1, 'config': [
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_name, 'mac_address': mac_addr,
|
|
Packit Service |
a04d08 |
'subnets': [{'type': 'dhcp4'}]}]}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
self.m_netfail_master.return_value = False
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual([mock.call(nic_name)],
|
|
Packit Service |
a04d08 |
self.m_netfail_master.call_args_list)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_checks_v1_skips_non_phys_interfaces(self):
|
|
Packit Service |
a04d08 |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'bond0'
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_addr: nic_name,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 1, 'config': [
|
|
Packit Service |
a04d08 |
{'type': 'bond', 'name': nic_name, 'mac_address': mac_addr,
|
|
Packit Service |
a04d08 |
'subnets': [{'type': 'dhcp4'}]}]}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(0, self.m_netfail_master.call_count)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_removes_master_mac_property_v1(self):
|
|
Packit Service |
a04d08 |
nic_master, mac_master = 'ens3', self.random_string()
|
|
Packit Service |
a04d08 |
nic_other, mac_other = 'ens7', self.random_string()
|
|
Packit Service |
a04d08 |
nic_extra, mac_extra = 'enp0s1f2', self.random_string()
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_master: nic_master,
|
|
Packit Service |
a04d08 |
mac_other: nic_other,
|
|
Packit Service |
a04d08 |
mac_extra: nic_extra,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 1, 'config': [
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_master,
|
|
Packit Service |
a04d08 |
'mac_address': mac_master},
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_other, 'mac_address': mac_other},
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_extra, 'mac_address': mac_extra},
|
|
Packit Service |
a04d08 |
]}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _is_netfail_master(iface):
|
|
Packit Service |
a04d08 |
if iface == 'ens3':
|
|
Packit Service |
a04d08 |
return True
|
|
Packit Service |
a04d08 |
return False
|
|
Packit Service |
a04d08 |
self.m_netfail_master.side_effect = _is_netfail_master
|
|
Packit Service |
a04d08 |
expected_cfg = {'version': 1, 'config': [
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_master},
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_other, 'mac_address': mac_other},
|
|
Packit Service |
a04d08 |
{'type': 'physical', 'name': nic_extra, 'mac_address': mac_extra},
|
|
Packit Service |
a04d08 |
]}
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(expected_cfg, netcfg)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_checks_v2_type_ethernet_interfaces(self):
|
|
Packit Service |
a04d08 |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'ens3'
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_addr: nic_name,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 2, 'ethernets': {
|
|
Packit Service |
a04d08 |
nic_name: {'dhcp4': True, 'critical': True, 'set-name': nic_name,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_addr}}}}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
self.m_netfail_master.return_value = False
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual([mock.call(nic_name)],
|
|
Packit Service |
a04d08 |
self.m_netfail_master.call_args_list)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_skips_v2_non_ethernet_interfaces(self):
|
|
Packit Service |
a04d08 |
mac_addr, nic_name = '00:00:17:02:2b:b1', 'wlps0'
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_addr: nic_name,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 2, 'wifis': {
|
|
Packit Service |
a04d08 |
nic_name: {'dhcp4': True, 'critical': True, 'set-name': nic_name,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_addr}}}}
|
|
Packit Service |
a04d08 |
passed_netcfg = copy.copy(netcfg)
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(netcfg, passed_netcfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(0, self.m_netfail_master.call_count)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_removes_master_mac_property_v2(self):
|
|
Packit Service |
a04d08 |
nic_master, mac_master = 'ens3', self.random_string()
|
|
Packit Service |
a04d08 |
nic_other, mac_other = 'ens7', self.random_string()
|
|
Packit Service |
a04d08 |
nic_extra, mac_extra = 'enp0s1f2', self.random_string()
|
|
Packit Service |
a04d08 |
self.m_get_interfaces_by_mac.return_value = {
|
|
Packit Service |
a04d08 |
mac_master: nic_master,
|
|
Packit Service |
a04d08 |
mac_other: nic_other,
|
|
Packit Service |
a04d08 |
mac_extra: nic_extra,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
netcfg = {'version': 2, 'ethernets': {
|
|
Packit Service |
a04d08 |
nic_extra: {'dhcp4': True, 'set-name': nic_extra,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_extra}},
|
|
Packit Service |
a04d08 |
nic_other: {'dhcp4': True, 'set-name': nic_other,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_other}},
|
|
Packit Service |
a04d08 |
nic_master: {'dhcp4': True, 'set-name': nic_master,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_master}},
|
|
Packit Service |
a04d08 |
}}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _is_netfail_master(iface):
|
|
Packit Service |
a04d08 |
if iface == 'ens3':
|
|
Packit Service |
a04d08 |
return True
|
|
Packit Service |
a04d08 |
return False
|
|
Packit Service |
a04d08 |
self.m_netfail_master.side_effect = _is_netfail_master
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
expected_cfg = {'version': 2, 'ethernets': {
|
|
Packit Service |
a04d08 |
nic_master: {'dhcp4': True, 'match': {'name': nic_master}},
|
|
Packit Service |
a04d08 |
nic_extra: {'dhcp4': True, 'set-name': nic_extra,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_extra}},
|
|
Packit Service |
a04d08 |
nic_other: {'dhcp4': True, 'set-name': nic_other,
|
|
Packit Service |
a04d08 |
'match': {'macaddress': mac_other}},
|
|
Packit Service |
a04d08 |
}}
|
|
Packit Service |
a04d08 |
oracle._ensure_netfailover_safe(netcfg)
|
|
Packit Service |
a04d08 |
import pprint
|
|
Packit Service |
a04d08 |
pprint.pprint(netcfg)
|
|
Packit Service |
a04d08 |
print('---- ^^ modified ^^ ---- vv original vv ----')
|
|
Packit Service |
a04d08 |
pprint.pprint(expected_cfg)
|
|
Packit Service |
a04d08 |
self.assertEqual(expected_cfg, netcfg)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
751c4a |
def _mock_v2_urls(httpretty):
|
|
Packit Service |
751c4a |
def instance_callback(request, uri, response_headers):
|
|
Packit Service |
751c4a |
print(response_headers)
|
|
Packit Service |
751c4a |
assert request.headers.get("Authorization") == "Bearer Oracle"
|
|
Packit Service |
751c4a |
return [200, response_headers, OPC_V2_METADATA]
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def vnics_callback(request, uri, response_headers):
|
|
Packit Service |
751c4a |
assert request.headers.get("Authorization") == "Bearer Oracle"
|
|
Packit Service |
751c4a |
return [200, response_headers, OPC_BM_SECONDARY_VNIC_RESPONSE]
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v2/instance/",
|
|
Packit Service |
751c4a |
body=instance_callback
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v2/vnics/",
|
|
Packit Service |
751c4a |
body=vnics_callback
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def _mock_no_v2_urls(httpretty):
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v2/instance/",
|
|
Packit Service |
751c4a |
status=404,
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v1/instance/",
|
|
Packit Service |
751c4a |
body=OPC_V1_METADATA
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v1/vnics/",
|
|
Packit Service |
751c4a |
body=OPC_BM_SECONDARY_VNIC_RESPONSE
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
class TestReadOpcMetadata:
|
|
Packit Service |
751c4a |
# See https://docs.pytest.org/en/stable/example
|
|
Packit Service |
751c4a |
# /parametrize.html#parametrizing-conditional-raising
|
|
Packit Service |
751c4a |
does_not_raise = ExitStack
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@mock.patch("cloudinit.url_helper.time.sleep", lambda _: None)
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
'version,setup_urls,instance_data,fetch_vnics,vnics_data', [
|
|
Packit Service |
751c4a |
(2, _mock_v2_urls, json.loads(OPC_V2_METADATA), True,
|
|
Packit Service |
751c4a |
json.loads(OPC_BM_SECONDARY_VNIC_RESPONSE)),
|
|
Packit Service |
751c4a |
(2, _mock_v2_urls, json.loads(OPC_V2_METADATA), False, None),
|
|
Packit Service |
751c4a |
(1, _mock_no_v2_urls, json.loads(OPC_V1_METADATA), True,
|
|
Packit Service |
751c4a |
json.loads(OPC_BM_SECONDARY_VNIC_RESPONSE)),
|
|
Packit Service |
751c4a |
(1, _mock_no_v2_urls, json.loads(OPC_V1_METADATA), False, None),
|
|
Packit Service |
751c4a |
]
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_metadata_returned(
|
|
Packit Service |
751c4a |
self, version, setup_urls, instance_data,
|
|
Packit Service |
751c4a |
fetch_vnics, vnics_data, httpretty
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
setup_urls(httpretty)
|
|
Packit Service |
751c4a |
metadata = oracle.read_opc_metadata(fetch_vnics_data=fetch_vnics)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert version == metadata.version
|
|
Packit Service |
751c4a |
assert instance_data == metadata.instance_data
|
|
Packit Service |
751c4a |
assert vnics_data == metadata.vnics_data
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
# No need to actually wait between retries in the tests
|
|
Packit Service |
751c4a |
@mock.patch("cloudinit.url_helper.time.sleep", lambda _: None)
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
"v2_failure_count,v1_failure_count,expected_body,expectation",
|
|
Packit Service |
751c4a |
[
|
|
Packit Service |
751c4a |
(1, 0, json.loads(OPC_V2_METADATA), does_not_raise()),
|
|
Packit Service |
751c4a |
(2, 0, json.loads(OPC_V2_METADATA), does_not_raise()),
|
|
Packit Service |
751c4a |
(3, 0, json.loads(OPC_V1_METADATA), does_not_raise()),
|
|
Packit Service |
751c4a |
(3, 1, json.loads(OPC_V1_METADATA), does_not_raise()),
|
|
Packit Service |
751c4a |
(3, 2, json.loads(OPC_V1_METADATA), does_not_raise()),
|
|
Packit Service |
751c4a |
(3, 3, None, pytest.raises(UrlError)),
|
|
Packit Service |
751c4a |
]
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_retries(self, v2_failure_count, v1_failure_count,
|
|
Packit Service |
751c4a |
expected_body, expectation, httpretty):
|
|
Packit Service |
751c4a |
v2_responses = [httpretty.Response("", status=404)] * v2_failure_count
|
|
Packit Service |
751c4a |
v2_responses.append(httpretty.Response(OPC_V2_METADATA))
|
|
Packit Service |
751c4a |
v1_responses = [httpretty.Response("", status=404)] * v1_failure_count
|
|
Packit Service |
751c4a |
v1_responses.append(httpretty.Response(OPC_V1_METADATA))
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v1/instance/",
|
|
Packit Service |
751c4a |
responses=v1_responses,
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
httpretty.register_uri(
|
|
Packit Service |
751c4a |
httpretty.GET,
|
|
Packit Service |
751c4a |
"http://169.254.169.254/opc/v2/instance/",
|
|
Packit Service |
751c4a |
responses=v2_responses,
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
with expectation:
|
|
Packit Service |
751c4a |
assert expected_body == oracle.read_opc_metadata().instance_data
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
class TestCommon_GetDataBehaviour:
|
|
Packit Service |
751c4a |
"""This test class tests behaviour common to iSCSI and non-iSCSI root.
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
It defines a fixture, parameterized_oracle_ds, which is used in all the
|
|
Packit Service |
751c4a |
tests herein to test that the commonly expected behaviour is the same with
|
|
Packit Service |
751c4a |
iSCSI root and without.
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
(As non-iSCSI root behaviour is a superset of iSCSI root behaviour this
|
|
Packit Service |
751c4a |
class is implicitly also testing all iSCSI root behaviour so there is no
|
|
Packit Service |
751c4a |
separate class for that case.)
|
|
Packit Service |
751c4a |
"""
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.yield_fixture(params=[True, False])
|
|
Packit Service |
751c4a |
def parameterized_oracle_ds(self, request, oracle_ds):
|
|
Packit Service |
751c4a |
"""oracle_ds parameterized for iSCSI and non-iSCSI root respectively"""
|
|
Packit Service |
751c4a |
is_iscsi_root = request.param
|
|
Packit Service |
751c4a |
with ExitStack() as stack:
|
|
Packit Service |
751c4a |
stack.enter_context(
|
|
Packit Service |
751c4a |
mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + "._is_iscsi_root", return_value=is_iscsi_root
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
if not is_iscsi_root:
|
|
Packit Service |
751c4a |
stack.enter_context(
|
|
Packit Service |
751c4a |
mock.patch(DS_PATH + ".net.find_fallback_nic")
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
stack.enter_context(
|
|
Packit Service |
751c4a |
mock.patch(DS_PATH + ".dhcp.EphemeralDHCPv4")
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
yield oracle_ds
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + "._is_platform_viable", mock.Mock(return_value=False)
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_false_if_platform_not_viable(
|
|
Packit Service |
751c4a |
self, parameterized_oracle_ds,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert not parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
"keyname,expected_value",
|
|
Packit Service |
751c4a |
(
|
|
Packit Service |
751c4a |
("availability-zone", "phx-ad-3"),
|
|
Packit Service |
751c4a |
("launch-index", 0),
|
|
Packit Service |
751c4a |
("local-hostname", "instance-20200320-1400"),
|
|
Packit Service |
751c4a |
(
|
|
Packit Service |
751c4a |
"instance-id",
|
|
Packit Service |
751c4a |
"ocid1.instance.oc1.phx"
|
|
Packit Service |
751c4a |
".anyhqljtniwq6syc3nex55sep5w34qbwmw6TRUNCATED",
|
|
Packit Service |
751c4a |
),
|
|
Packit Service |
751c4a |
("name", "instance-20200320-1400"),
|
|
Packit Service |
751c4a |
(
|
|
Packit Service |
751c4a |
"public_keys",
|
|
Packit Service |
751c4a |
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ truncated",
|
|
Packit Service |
751c4a |
),
|
|
Packit Service |
751c4a |
),
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_metadata_keys_set_correctly(
|
|
Packit Service |
751c4a |
self, keyname, expected_value, parameterized_oracle_ds,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
assert expected_value == parameterized_oracle_ds.metadata[keyname]
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
"attribute_name,expected_value",
|
|
Packit Service |
751c4a |
[
|
|
Packit Service |
751c4a |
("_crawled_metadata", json.loads(OPC_V2_METADATA)),
|
|
Packit Service |
751c4a |
(
|
|
Packit Service |
751c4a |
"userdata_raw",
|
|
Packit Service |
751c4a |
base64.b64decode(b"IyEvYmluL3NoCnRvdWNoIC90bXAvZm9v"),
|
|
Packit Service |
751c4a |
),
|
|
Packit Service |
751c4a |
("system_uuid", "my-test-uuid"),
|
|
Packit Service |
751c4a |
],
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
@mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + "._read_system_uuid", mock.Mock(return_value="my-test-uuid")
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_attributes_set_correctly(
|
|
Packit Service |
751c4a |
self, attribute_name, expected_value, parameterized_oracle_ds,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
assert expected_value == getattr(
|
|
Packit Service |
751c4a |
parameterized_oracle_ds, attribute_name
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
"ssh_keys,expected_value",
|
|
Packit Service |
751c4a |
[
|
|
Packit Service |
751c4a |
# No SSH keys in metadata => no keys detected
|
|
Packit Service |
751c4a |
(None, []),
|
|
Packit Service |
751c4a |
# Empty SSH keys in metadata => no keys detected
|
|
Packit Service |
751c4a |
("", []),
|
|
Packit Service |
751c4a |
# Single SSH key in metadata => single key detected
|
|
Packit Service |
751c4a |
("ssh-rsa ... test@test", ["ssh-rsa ... test@test"]),
|
|
Packit Service |
751c4a |
# Multiple SSH keys in metadata => multiple keys detected
|
|
Packit Service |
751c4a |
(
|
|
Packit Service |
751c4a |
"ssh-rsa ... test@test\nssh-rsa ... test2@test2",
|
|
Packit Service |
751c4a |
["ssh-rsa ... test@test", "ssh-rsa ... test2@test2"],
|
|
Packit Service |
751c4a |
),
|
|
Packit Service |
751c4a |
],
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_public_keys_handled_correctly(
|
|
Packit Service |
751c4a |
self, ssh_keys, expected_value, parameterized_oracle_ds
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
instance_data = json.loads(OPC_V1_METADATA)
|
|
Packit Service |
751c4a |
if ssh_keys is None:
|
|
Packit Service |
751c4a |
del instance_data["metadata"]["ssh_authorized_keys"]
|
|
Packit Service |
751c4a |
else:
|
|
Packit Service |
751c4a |
instance_data["metadata"]["ssh_authorized_keys"] = ssh_keys
|
|
Packit Service |
751c4a |
metadata = OpcMetadata(None, instance_data, None)
|
|
Packit Service |
751c4a |
with mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + ".read_opc_metadata", mock.Mock(return_value=metadata),
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
assert (
|
|
Packit Service |
751c4a |
expected_value == parameterized_oracle_ds.get_public_ssh_keys()
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_missing_user_data_handled_gracefully(
|
|
Packit Service |
751c4a |
self, parameterized_oracle_ds
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
instance_data = json.loads(OPC_V1_METADATA)
|
|
Packit Service |
751c4a |
del instance_data["metadata"]["user_data"]
|
|
Packit Service |
751c4a |
metadata = OpcMetadata(None, instance_data, None)
|
|
Packit Service |
751c4a |
with mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + ".read_opc_metadata", mock.Mock(return_value=metadata),
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds.userdata_raw is None
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_missing_metadata_handled_gracefully(
|
|
Packit Service |
751c4a |
self, parameterized_oracle_ds
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
instance_data = json.loads(OPC_V1_METADATA)
|
|
Packit Service |
751c4a |
del instance_data["metadata"]
|
|
Packit Service |
751c4a |
metadata = OpcMetadata(None, instance_data, None)
|
|
Packit Service |
751c4a |
with mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + ".read_opc_metadata", mock.Mock(return_value=metadata),
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds._get_data()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert parameterized_oracle_ds.userdata_raw is None
|
|
Packit Service |
751c4a |
assert [] == parameterized_oracle_ds.get_public_ssh_keys()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@mock.patch(DS_PATH + "._is_iscsi_root", lambda: False)
|
|
Packit Service |
751c4a |
class TestNonIscsiRoot_GetDataBehaviour:
|
|
Packit Service |
751c4a |
@mock.patch(DS_PATH + ".dhcp.EphemeralDHCPv4")
|
|
Packit Service |
751c4a |
@mock.patch(DS_PATH + ".net.find_fallback_nic")
|
|
Packit Service |
751c4a |
def test_read_opc_metadata_called_with_ephemeral_dhcp(
|
|
Packit Service |
751c4a |
self, m_find_fallback_nic, m_EphemeralDHCPv4, oracle_ds
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
in_context_manager = False
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def enter_context_manager():
|
|
Packit Service |
751c4a |
nonlocal in_context_manager
|
|
Packit Service |
751c4a |
in_context_manager = True
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def exit_context_manager(*args):
|
|
Packit Service |
751c4a |
nonlocal in_context_manager
|
|
Packit Service |
751c4a |
in_context_manager = False
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
m_EphemeralDHCPv4.return_value.__enter__.side_effect = (
|
|
Packit Service |
751c4a |
enter_context_manager
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
m_EphemeralDHCPv4.return_value.__exit__.side_effect = (
|
|
Packit Service |
751c4a |
exit_context_manager
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def assert_in_context_manager(**kwargs):
|
|
Packit Service |
751c4a |
assert in_context_manager
|
|
Packit Service |
751c4a |
return mock.MagicMock()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
with mock.patch(
|
|
Packit Service |
751c4a |
DS_PATH + ".read_opc_metadata",
|
|
Packit Service |
751c4a |
mock.Mock(side_effect=assert_in_context_manager),
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
assert oracle_ds._get_data()
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert [
|
|
Packit Service |
751c4a |
mock.call(m_find_fallback_nic.return_value)
|
|
Packit Service |
751c4a |
] == m_EphemeralDHCPv4.call_args_list
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@mock.patch(DS_PATH + ".get_interfaces_by_mac", lambda: {})
|
|
Packit Service |
751c4a |
@mock.patch(DS_PATH + ".cmdline.read_initramfs_config")
|
|
Packit Service |
751c4a |
class TestNetworkConfig:
|
|
Packit Service |
751c4a |
def test_network_config_cached(self, m_read_initramfs_config, oracle_ds):
|
|
Packit Service |
751c4a |
""".network_config should be cached"""
|
|
Packit Service |
751c4a |
assert 0 == m_read_initramfs_config.call_count
|
|
Packit Service |
751c4a |
oracle_ds.network_config # pylint: disable=pointless-statement
|
|
Packit Service |
751c4a |
assert 1 == m_read_initramfs_config.call_count
|
|
Packit Service |
751c4a |
oracle_ds.network_config # pylint: disable=pointless-statement
|
|
Packit Service |
751c4a |
assert 1 == m_read_initramfs_config.call_count
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_network_cmdline(self, m_read_initramfs_config, oracle_ds):
|
|
Packit Service |
751c4a |
"""network_config should prefer initramfs config over fallback"""
|
|
Packit Service |
751c4a |
ncfg = {"version": 1, "config": [{"a": "b"}]}
|
|
Packit Service |
751c4a |
m_read_initramfs_config.return_value = copy.deepcopy(ncfg)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert ncfg == oracle_ds.network_config
|
|
Packit Service |
751c4a |
assert 0 == oracle_ds.distro.generate_fallback_config.call_count
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_network_fallback(self, m_read_initramfs_config, oracle_ds):
|
|
Packit Service |
751c4a |
"""network_config should prefer initramfs config over fallback"""
|
|
Packit Service |
751c4a |
ncfg = {"version": 1, "config": [{"a": "b"}]}
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
m_read_initramfs_config.return_value = None
|
|
Packit Service |
751c4a |
oracle_ds.distro.generate_fallback_config.return_value = copy.deepcopy(
|
|
Packit Service |
751c4a |
ncfg
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
assert ncfg == oracle_ds.network_config
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
@pytest.mark.parametrize(
|
|
Packit Service |
751c4a |
"configure_secondary_nics,expect_secondary_nics",
|
|
Packit Service |
751c4a |
[(True, True), (False, False), (None, False)],
|
|
Packit Service |
751c4a |
)
|
|
Packit Service |
751c4a |
def test_secondary_nic_addition(
|
|
Packit Service |
751c4a |
self,
|
|
Packit Service |
751c4a |
m_read_initramfs_config,
|
|
Packit Service |
751c4a |
configure_secondary_nics,
|
|
Packit Service |
751c4a |
expect_secondary_nics,
|
|
Packit Service |
751c4a |
oracle_ds,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
"""Test that _add_network_config_from_opc_imds is called as expected
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
(configure_secondary_nics=None is used to test the default behaviour.)
|
|
Packit Service |
751c4a |
"""
|
|
Packit Service |
751c4a |
m_read_initramfs_config.return_value = {"version": 1, "config": []}
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
if configure_secondary_nics is not None:
|
|
Packit Service |
751c4a |
oracle_ds.ds_cfg[
|
|
Packit Service |
751c4a |
"configure_secondary_nics"
|
|
Packit Service |
751c4a |
] = configure_secondary_nics
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def side_effect(self):
|
|
Packit Service |
751c4a |
self._network_config["secondary_added"] = mock.sentinel.needle
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = 'DummyData'
|
|
Packit Service |
751c4a |
with mock.patch.object(
|
|
Packit Service |
751c4a |
oracle.DataSourceOracle, "_add_network_config_from_opc_imds",
|
|
Packit Service |
751c4a |
new=side_effect,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
was_secondary_added = "secondary_added" in oracle_ds.network_config
|
|
Packit Service |
751c4a |
assert expect_secondary_nics == was_secondary_added
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_secondary_nic_failure_isnt_blocking(
|
|
Packit Service |
751c4a |
self,
|
|
Packit Service |
751c4a |
m_read_initramfs_config,
|
|
Packit Service |
751c4a |
caplog,
|
|
Packit Service |
751c4a |
oracle_ds,
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
oracle_ds.ds_cfg["configure_secondary_nics"] = True
|
|
Packit Service |
751c4a |
oracle_ds._vnics_data = "DummyData"
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
with mock.patch.object(
|
|
Packit Service |
751c4a |
oracle.DataSourceOracle, "_add_network_config_from_opc_imds",
|
|
Packit Service |
751c4a |
side_effect=Exception()
|
|
Packit Service |
751c4a |
):
|
|
Packit Service |
751c4a |
network_config = oracle_ds.network_config
|
|
Packit Service |
751c4a |
assert network_config == m_read_initramfs_config.return_value
|
|
Packit Service |
751c4a |
assert "Failed to parse secondary network configuration" in caplog.text
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
def test_ds_network_cfg_preferred_over_initramfs(self, _m):
|
|
Packit Service |
751c4a |
"""Ensure that DS net config is preferred over initramfs config"""
|
|
Packit Service |
751c4a |
config_sources = oracle.DataSourceOracle.network_config_sources
|
|
Packit Service |
751c4a |
ds_idx = config_sources.index(NetworkConfigSource.ds)
|
|
Packit Service |
751c4a |
initramfs_idx = config_sources.index(NetworkConfigSource.initramfs)
|
|
Packit Service |
751c4a |
assert ds_idx < initramfs_idx
|
|
Packit Service |
751c4a |
|
|
Packit Service |
751c4a |
|
|
Packit Service |
a04d08 |
# vi: ts=4 expandtab
|