Blame cloudinit/sources/tests/test_oracle.py

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