def test_validate_default_deploy_interface(self):
     hookenv.config.return_value = {
         "default-deploy-interface": "direct",
         "enabled-deploy-interfaces": "direct, iscsi"
     }
     target = ironic.IronicConductorCharm()
     self.assertIsNone(target._validate_default_deploy_interface())
 def test_validate_default_net_interface(self):
     hookenv.config.return_value = {
         "default-network-interface": "flat",
         "enabled-network-interfaces": "neutron, flat, noop"
     }
     target = ironic.IronicConductorCharm()
     self.assertIsNone(target._validate_default_net_interface())
    def test_enabled_deploy_interfaces(self):
        cfg_data = {"enabled-deploy-interfaces": "fake, fake2"}
        hookenv.config.return_value = cfg_data
        target = ironic.IronicConductorCharm()
        self.get_pxe_config_class.assert_called_with(cfg_data)

        self.assertEqual(target.enabled_deploy_interfaces, ["fake", "fake2"])
    def test_setup_power_adapter_config_train(self):
        os_release.return_value = "train"
        cfg_data = {
            "enabled-hw-types": "ipmi, redfish, idrac",
        }

        hookenv.config.return_value = cfg_data

        target = ironic.IronicConductorCharm()
        target._setup_power_adapter_config()
        expected = {
            "enabled_hardware_types":
            "intel-ipmi, idrac, ipmi, redfish",
            "enabled_management_interfaces": ("idrac-redfish, ipmitool, "
                                              "redfish, intel-ipmitool, noop"),
            "enabled_inspect_interfaces":
            "idrac-redfish, redfish, no-inspect",
            "enabled_power_interfaces":
            "idrac-redfish, ipmitool, redfish",
            "enabled_console_interfaces": ("ipmitool-shellinabox, "
                                           "ipmitool-socat, no-console"),
            "enabled_raid_interfaces":
            "idrac-wsman, no-raid",
            "enabled_vendor_interfaces":
            "ipmitool, idrac-wsman, no-vendor",
            "enabled_boot_interfaces":
            "pxe",
            "enabled_bios_interfaces":
            "no-bios"
        }
        self.assertEqual(target.config["hardware_type_cfg"], expected)
 def test_custom_assess_status_check_all_good(self):
     hookenv.config.return_value = {
         "default-deploy-interface": "direct",
         "enabled-deploy-interfaces": "direct, iscsi",
         "default-network-interface": "flat",
         "enabled-network-interfaces": "neutron, flat, noop"
     }
     target = ironic.IronicConductorCharm()
     self.assertEqual(target.custom_assess_status_check(), (None, None))
    def test_validate_deploy_interfaces(self):
        target = ironic.IronicConductorCharm()
        with self.assertRaises(ValueError) as err:
            target._validate_deploy_interfaces(["bogus"])

        expected_msg = ('Deploy interface bogus is not valid.'
                        ' Valid interfaces are: direct, iscsi')

        self.assertIsNone(target._validate_deploy_interfaces(["direct"]))
        self.assertEqual(str(err.exception), expected_msg)
 def test_configure_defaults_no_cfg(self):
     cfg_data = {
         "default-network-interface": "",
         "default-deploy-interface": ""
     }
     hookenv.config.return_value = cfg_data
     target = ironic.IronicConductorCharm()
     self.assertEqual(target.config.get("default-network-interface"),
                      ironic.DEFAULT_NET_IFACE)
     self.assertEqual(target.config.get("default-deploy-interface"),
                      ironic.DEFAULT_DEPLOY_IFACE)
 def test_validate_deploy_interfaces_tmp_secret(self):
     # leadership.set.temp_url_secret is not set, and "direct"
     # boot method is enabled. Validate will fail, until
     # set-temp-url-secret action is run
     reactive.is_flag_set.side_effect = [False, True]
     target = ironic.IronicConductorCharm()
     with self.assertRaises(ValueError) as err:
         target._validate_deploy_interfaces(["direct"])
     expected_msg = ('run set-temp-url-secret action on '
                     'leader to enable direct deploy method')
     self.assertEqual(str(err.exception), expected_msg)
    def test_validate_default_deploy_interface_invalid_default(self):
        hookenv.config.return_value = {
            "default-deploy-interface": "bogus",
            "enabled-deploy-interfaces": "direct, iscsi"
        }
        target = ironic.IronicConductorCharm()
        with self.assertRaises(ValueError) as err:
            target._validate_default_deploy_interface()

        expected_msg = ("default-deploy-interface (bogus) is not enabled "
                        "in enabled-deploy-interfaces: direct, iscsi")
        self.assertEqual(str(err.exception), expected_msg)
    def test_validate_default_net_interface_invalid_default(self):
        hookenv.config.return_value = {
            "default-network-interface": "bogus",
            "enabled-network-interfaces": "neutron, flat, noop"
        }
        target = ironic.IronicConductorCharm()
        with self.assertRaises(ValueError) as err:
            target._validate_default_net_interface()

        expected_msg = ("default-network-interface (bogus) is not enabled "
                        "in enabled-network-interfaces: neutron, flat, noop")
        self.assertEqual(str(err.exception), expected_msg)
    def test_get_amqp_credentials(self):
        cfg_data = {
            "rabbit-user": "******",
            "rabbit-vhost": "openstack",
        }

        hookenv.config.return_value = cfg_data
        target = ironic.IronicConductorCharm()
        self.get_pxe_config_class.assert_called_with(cfg_data)

        result = target.get_amqp_credentials()
        self.assertEqual(result, ('ironic', 'openstack'))
 def test_custom_assess_status_check_invalid_default_net_iface(self):
     hookenv.config.return_value = {
         "default-deploy-interface": "direct",
         "enabled-deploy-interfaces": "direct, iscsi",
         "default-network-interface": "bogus",
         "enabled-network-interfaces": "neutron, flat, noop"
     }
     target = ironic.IronicConductorCharm()
     expected_status = (
         'blocked', 'invalid default-network-interface config, '
         'default-network-interface (bogus) is not enabled '
         'in enabled-network-interfaces: neutron, flat, noop')
     self.assertEqual(target.custom_assess_status_check(), expected_status)
 def test_custom_assess_status_check_invalid_enabled_deploy_ifaces(self):
     hookenv.config.return_value = {
         "default-deploy-interface": "direct",
         "enabled-deploy-interfaces": "bogus, iscsi",
         "default-network-interface": "flat",
         "enabled-network-interfaces": "neutron, flat, noop"
     }
     target = ironic.IronicConductorCharm()
     expected_status = (
         'blocked',
         'invalid enabled-deploy-interfaces config, Deploy interface '
         'bogus is not valid. Valid interfaces are: direct, iscsi')
     self.assertEqual(target.custom_assess_status_check(), expected_status)
    def test_configure_defaults_with_user_defined_val(self):
        cfg_data = {
            "default-network-interface": "fake_net",
            "default-deploy-interface": "fake_deploy"
        }

        hookenv.config.return_value = cfg_data
        target = ironic.IronicConductorCharm()
        target._configure_defaults()

        self.assertEqual(target.config.get("default-network-interface"),
                         "fake_net")
        self.assertEqual(target.config.get("default-deploy-interface"),
                         "fake_deploy")
    def test_get_database_setup(self):
        cfg_data = {
            "database-user": "******",
            "database": "ironicdb",
        }

        hookenv.config.return_value = cfg_data
        target = ironic.IronicConductorCharm()
        self.get_pxe_config_class.assert_called_with(cfg_data)

        result = target.get_database_setup()
        self.assertEqual(result, [{
            "database": cfg_data["database"],
            "username": cfg_data["database-user"]
        }])
    def test_setup_pxe_config(self):
        hookenv.config.return_value = {
            "default-network-interface": "fake_net",
            "default-deploy-interface": "fake_deploy"
        }

        target = ironic.IronicConductorCharm()
        target._setup_pxe_config(self.mocked_pxe_cfg)
        expected_pkgs = ironic.PACKAGES + ["fakepkg1", "fakepkg2"]

        expected_cfg = {
            'tftpboot': ctrl_util.PXEBootBase.TFTP_ROOT,
            'httpboot': ctrl_util.PXEBootBase.HTTP_ROOT,
            'ironic_user': ctrl_util.PXEBootBase.IRONIC_USER,
            'ironic_group': ctrl_util.PXEBootBase.IRONIC_GROUP,
            'hardware_type_cfg': {
                'enabled_hardware_types':
                'intel-ipmi, ipmi',
                'enabled_management_interfaces': ('intel-ipmitool, ipmitool,'
                                                  ' noop'),
                'enabled_inspect_interfaces':
                'no-inspect',
                'enabled_power_interfaces':
                'ipmitool',
                'enabled_console_interfaces': ('ipmitool-shellinabox, '
                                               'ipmitool-socat, no-console'),
                'enabled_raid_interfaces':
                'no-raid',
                'enabled_vendor_interfaces':
                'ipmitool, no-vendor',
                'enabled_boot_interfaces':
                'pxe',
                'enabled_bios_interfaces':
                'no-bios'
            },
            'default-network-interface': 'fake_net',
            'default-deploy-interface': 'fake_deploy'
        }

        self.assertEqual(target.packages.sort(), expected_pkgs.sort())
        self.assertEqual(target.config, expected_cfg)
        self.assertEqual(target.restart_map.get("fake_config", []),
                         ["fake_svc"])
        self.assertTrue("fakehttpd" in target.services)
 def test_validate_network_interfaces(self):
     target = ironic.IronicConductorCharm()
     with self.assertRaises(ValueError):
         target._validate_network_interfaces(["bogus"])
     self.assertIsNone(target._validate_network_interfaces(["neutron"]))