Exemplo n.º 1
0
 def setUp(self):
     self.name = 'name'
     self.uuid = 'uuid'
     self.name_gen = Mock(return_value=self.name)
     self.pv_service = Mock()
     self.si = Mock()
     self.clone_parmas = Mock()
     self.clone_res = Mock()
     self.clone_res.error = None
     self.clone_res.vm = Mock()
     self.clone_res.vm.summary = Mock()
     self.clone_res.vm.summary.config = Mock()
     self.clone_res.vm.summary.config.uuid = self.uuid
     self.pv_service.CloneVmParameters = Mock(
         return_value=self.clone_parmas)
     self.pv_service.clone_vm = Mock(return_value=self.clone_res)
     self.image_deployer = Mock()
     self.image_deployer.deploy_image = Mock(return_value=True)
     self.vm = Mock()
     self.vm.config = Mock()
     self.vm.config.uuid = self.uuid
     self.pv_service.find_vm_by_name = Mock(return_value=self.vm)
     self.cs_helper = Mock()
     self.model_parser = ResourceModelParser()
     self.deployer = VirtualMachineDeployer(self.pv_service, self.name_gen,
                                            self.image_deployer,
                                            self.cs_helper,
                                            self.model_parser)
Exemplo n.º 2
0
 def setUp(self):
     self.name = 'name'
     self.uuid = 'uuid'
     self.name_gen = Mock(return_value=self.name)
     self.pv_service = Mock()
     self.si = Mock()
     self.clone_parmas = Mock()
     self.clone_res = Mock()
     self.clone_res.error = None
     self.clone_res.vm = Mock()
     self.clone_res.vm.summary = Mock()
     self.clone_res.vm.summary.config = Mock()
     self.clone_res.vm.summary.config.uuid = self.uuid
     self.pv_service.CloneVmParameters = Mock(return_value=self.clone_parmas)
     self.pv_service.clone_vm = Mock(return_value=self.clone_res)
     self.image_deployer = Mock()
     self.image_deployer.deploy_image = Mock(return_value=True)
     self.vm = Mock()
     self.vm.config = Mock()
     self.vm.config.uuid = self.uuid
     self.pv_service.find_vm_by_name = Mock(return_value=self.vm)
     self.cs_helper = Mock()
     self.model_parser = ResourceModelParser()
     self.deployer = VirtualMachineDeployer(self.pv_service, self.name_gen, self.image_deployer, self.cs_helper,
                                            self.model_parser)
    def test_deploy_image(self):
        # arrange

        cred = TestCredentials()
        pv_service = pyVmomiService(SmartConnect, Disconnect)
        si = pv_service.connect(cred.host, cred.username, cred.password)
        service = OvfImageDeployerService(
            'C:\\Program Files\\VMware\\VMware OVF Tool\\ovftool.exe', Mock())
        deployer = VirtualMachineDeployer(pv_service, generate_unique_name,
                                          service)

        # vm = pv_service.find_vm_by_name(si, 'QualiSB/Raz', '2')

        params = DeployDataHolder({
            "image_url": "http://192.168.65.88/ovf/Debian%2064%20-%20Yoav.ovf",
            "cluster_name": "QualiSB Cluster",
            "resource_pool": "LiverPool",
            "datastore_name": "datastore1",
            "datacenter_name": "QualiSB",
            "power_on": True,
            "app_name": "appName 1",
            "vm_folder": "Raz 2"
        })

        deploy_command = DeployCommand(deployer)
        # act
        result = deploy_command.execute_deploy_from_image(si, params, cred)

        # assert
        self.assertIsNotNone(result)
    def test_deploy_template(self):
        # arrange

        cred = TestCredentials()
        pv_service = pyVmomiService(SmartConnect, Disconnect)
        si = pv_service.connect(cred.host, cred.username, cred.password)
        deployer = VirtualMachineDeployer(pv_service, generate_unique_name)

        # vm = pv_service.find_vm_by_name(si, 'QualiSB/Raz', '2')

        deploy_params = DeployDataHolder({
            "template_model": {
                "vCenter_resource_name": "QualiSB",
                "vm_folder": "QualiSB/Raz",
                "template_name": "2"
            },
            "vm_cluster_model": {
                "cluster_name": "QualiSB Cluster",
                "resource_pool": "IT"
            },
            "datastore_name": "eric ds cluster",
            "power_on": False
        })

        deploy_command = DeployCommand(deployer)

        # act
        result = deploy_command.execute_deploy_from_template(si, deploy_params)

        # assert
        self.assertIsNotNone(result)
Exemplo n.º 5
0
    def __init__(self):
        """
        Initialize the driver session, this function is called everytime a new instance of the driver is created
        in here the driver is going to be bootstrapped

        :param context: models.QualiDriverModels.InitCommandContext
        """
        self.cs_helper = CloudshellDriverHelper()
        synchronous_task_waiter = SynchronousTaskWaiter()
        pv_service = pyVmomiService(connect=SmartConnect,
                                    disconnect=Disconnect,
                                    task_waiter=synchronous_task_waiter)
        self.resource_model_parser = ResourceModelParser()
        port_group_name_generator = DvPortGroupNameGenerator()

        vnic_to_network_mapper = VnicToNetworkMapper(
            quali_name_generator=port_group_name_generator)
        resource_remover = CloudshellResourceRemover()
        ovf_service = OvfImageDeployerService(self.resource_model_parser)

        self.vm_loader = VMLoader(pv_service)

        vm_deployer = VirtualMachineDeployer(
            pv_service=pv_service,
            name_generator=generate_unique_name,
            ovf_service=ovf_service,
            cs_helper=self.cs_helper,
            resource_model_parser=ResourceModelParser())

        dv_port_group_creator = DvPortGroupCreator(
            pyvmomi_service=pv_service,
            synchronous_task_waiter=synchronous_task_waiter)
        virtual_machine_port_group_configurer = \
            VirtualMachinePortGroupConfigurer(pyvmomi_service=pv_service,
                                              synchronous_task_waiter=synchronous_task_waiter,
                                              vnic_to_network_mapper=vnic_to_network_mapper,
                                              vnic_service=VNicService(),
                                              name_gen=port_group_name_generator)
        virtual_switch_to_machine_connector = VirtualSwitchToMachineConnector(
            dv_port_group_creator, virtual_machine_port_group_configurer)
        # Command Wrapper
        self.command_wrapper = CommandWrapper(
            pv_service=pv_service,
            cloud_shell_helper=self.cs_helper,
            resource_model_parser=self.resource_model_parser,
            context_based_logger_factory=ContextBasedLoggerFactory())
        # Deploy Command
        self.deploy_command = DeployCommand(deployer=vm_deployer)

        # Virtual Switch Revoke
        self.virtual_switch_disconnect_command = \
            VirtualSwitchToMachineDisconnectCommand(
                pyvmomi_service=pv_service,
                port_group_configurer=virtual_machine_port_group_configurer,
                resource_model_parser=self.resource_model_parser)

        # Virtual Switch Connect
        virtual_switch_connect_command = \
            VirtualSwitchConnectCommand(
                pv_service=pv_service,
                virtual_switch_to_machine_connector=virtual_switch_to_machine_connector,
                dv_port_group_name_generator=DvPortGroupNameGenerator(),
                vlan_spec_factory=VlanSpecFactory(),
                vlan_id_range_parser=VLanIdRangeParser())
        self.connection_orchestrator = ConnectionCommandOrchestrator(
            connector=virtual_switch_connect_command,
            disconnector=self.virtual_switch_disconnect_command,
            resource_model_parser=self.resource_model_parser)

        # Destroy VM Command
        self.destroy_virtual_machine_command = \
            DestroyVirtualMachineCommand(pv_service=pv_service,
                                         resource_remover=resource_remover,
                                         disconnector=self.virtual_switch_disconnect_command)
        # Power Command
        self.vm_power_management_command = \
            VirtualMachinePowerManagementCommand(pyvmomi_service=pv_service,
                                                 synchronous_task_waiter=synchronous_task_waiter)

        ip_manager = VMIPManager()

        # Refresh IP command
        self.refresh_ip_command = RefreshIpCommand(
            pyvmomi_service=pv_service,
            resource_model_parser=ResourceModelParser(),
            ip_manager=ip_manager)

        # Save Snapshot
        self.snapshot_saver = SaveSnapshotCommand(
            pyvmomi_service=pv_service, task_waiter=synchronous_task_waiter)

        # Snapshot Restorer
        self.snapshot_restorer = SnapshotRestoreCommand(
            pyvmomi_service=pv_service, task_waiter=synchronous_task_waiter)

        self.snapshots_retriever = RetrieveSnapshotsCommand(
            pyvmomi_service=pv_service)
Exemplo n.º 6
0
class TestVirtualMachineDeployer(TestCase):
    def setUp(self):
        self.name = 'name'
        self.uuid = 'uuid'
        self.name_gen = Mock(return_value=self.name)
        self.pv_service = Mock()
        self.si = Mock()
        self.clone_parmas = Mock()
        self.clone_res = Mock()
        self.clone_res.error = None
        self.clone_res.vm = Mock()
        self.clone_res.vm.summary = Mock()
        self.clone_res.vm.summary.config = Mock()
        self.clone_res.vm.summary.config.uuid = self.uuid
        self.pv_service.CloneVmParameters = Mock(return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        self.image_deployer = Mock()
        self.image_deployer.deploy_image = Mock(return_value=True)
        self.vm = Mock()
        self.vm.config = Mock()
        self.vm.config.uuid = self.uuid
        self.pv_service.find_vm_by_name = Mock(return_value=self.vm)
        self.cs_helper = Mock()
        self.model_parser = ResourceModelParser()
        self.deployer = VirtualMachineDeployer(self.pv_service, self.name_gen, self.image_deployer, self.cs_helper,
                                               self.model_parser)

    def test_vm_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_from_template(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name, 'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_clone_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(vCenterCloneVMFromVMResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'
        deploy_from_template_details.vcenter_vm = 'name'
        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_clone_from_vm(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name, 'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_snapshot_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(VCenterDeployVMFromLinkedCloneResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'
        deploy_from_template_details.vcenter_vm_snapshot = 'name/shanpshot'
        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_from_linked_clone(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name, 'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def _create_vcenter_resource_context(self):
        vc = VMwarevCenterResourceModel()
        vc.user = '******'
        vc.password = '******'
        vc.default_dvswitch = 'switch1'
        vc.holding_network = 'anetwork'
        vc.vm_cluster = 'Quali'
        vc.vm_location = 'Quali'
        vc.vm_resource_pool = 'Quali'
        vc.vm_storage = 'Quali'
        vc.shutdown_method = 'hard'
        vc.ovf_tool_path = 'C\\program files\ovf'
        vc.execution_server_selector = ''
        vc.reserved_networks = 'vlan65'
        vc.default_datacenter = 'QualiSB'

        return vc

    def test_vm_deployer_error(self):
        self.clone_res.error = Mock()

        self.pv_service.CloneVmParameters = Mock(return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        deploy_from_template_details = DeployFromTemplateDetails(vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        vcenter_data_model = self._create_vcenter_resource_context()

        self.assertRaises(Exception, self.deployer.deploy_from_template, self.si,
                          Mock(), deploy_from_template_details, vcenter_data_model)
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_vm_deployer_image(self):
        params = DeployDataHolder({
            'app_name': 'appName',
            'vcenter_name': 'vCenter',
            'image_params':
                {
                    "vcenter_image": "c:\image.ovf",
                    "vm_cluster": "QualiSB Cluster",
                    "vm_resource_pool": "LiverPool",
                    "vm_storage": "eric ds cluster",
                    "default_datacenter": "QualiSB",
                    "vm_location": "vm_location",
                    "auto_power_on": 'False',
                    "vcenter_name": 'vCenter',
                    "vcenter_image_arguments": "--compress=9,--schemaValidate,--etc",
                    'ip_regex': '',
                    'refresh_ip_timeout': '10',
                    'auto_power_on': 'True',
                    'auto_power_off': 'True',
                    'wait_for_ip': 'True',
                    'auto_delete': 'True',
                    'autoload': 'True'
                }
        })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.cs_helper.get_connection_details = Mock(return_value=connectivity)

        session = Mock()
        vcenter_data_model = Mock()
        vcenter_data_model.default_datacenter = 'qualisb'
        resource_context = Mock()

        res = self.deployer.deploy_from_image(si=self.si,
                                              logger=Mock(),
                                              session=session,
                                              vcenter_data_model=vcenter_data_model,
                                              data_holder=params,
                                              resource_context=resource_context)

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name,
                         params.vcenter_name)

    def test_vm_deployer_image_no_res(self):
        self.image_deployer.deploy_image = Mock(return_value=None)
        params = DeployDataHolder(
            {
                "image_url": "c:\image.ovf",
                "cluster_name": "QualiSB Cluster",
                "resource_pool": "LiverPool",
                "datastore_name": "eric ds cluster",
                "datacenter_name": "QualiSB",
                "power_on": False,
                "app_name": "appName",
                "user_arguments": ["--compress=9",
                                   "--schemaValidate", "--etc"
                                   ]
            })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si, params, connectivity)

    def test_vm_deployer_image_no_vm(self):
        self.pv_service.find_vm_by_name = Mock(return_value=None)
        params = DeployDataHolder(
            {
                "image_url": "c:\image.ovf",
                "cluster_name": "QualiSB Cluster",
                "resource_pool": "LiverPool",
                "datastore_name": "eric ds cluster",
                "datacenter_name": "QualiSB",
                "power_on": False,
                "app_name": "appName",
                "user_arguments": ["--compress=9",
                                   "--schemaValidate", "--etc"
                                   ]
            })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si, params, connectivity)
Exemplo n.º 7
0
class TestVirtualMachineDeployer(TestCase):
    def setUp(self):
        self.name = 'name'
        self.uuid = 'uuid'
        self.name_gen = Mock(return_value=self.name)
        self.pv_service = Mock()
        self.si = Mock()
        self.clone_parmas = Mock()
        self.clone_res = Mock()
        self.clone_res.error = None
        self.clone_res.vm = Mock()
        self.clone_res.vm.summary = Mock()
        self.clone_res.vm.summary.config = Mock()
        self.clone_res.vm.summary.config.uuid = self.uuid
        self.pv_service.CloneVmParameters = Mock(
            return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        self.image_deployer = Mock()
        self.image_deployer.deploy_image = Mock(return_value=True)
        self.vm = Mock()
        self.vm.config = Mock()
        self.vm.config.uuid = self.uuid
        self.pv_service.find_vm_by_name = Mock(return_value=self.vm)
        self.cs_helper = Mock()
        self.model_parser = ResourceModelParser()
        self.deployer = VirtualMachineDeployer(self.pv_service, self.name_gen,
                                               self.image_deployer,
                                               self.cs_helper,
                                               self.model_parser)

    def test_vm_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(
            vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_from_template(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name,
                         'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_clone_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(
            vCenterCloneVMFromVMResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'
        deploy_from_template_details.vcenter_vm = 'name'
        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_clone_from_vm(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name,
                         'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_snapshot_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(
            VCenterDeployVMFromLinkedCloneResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'
        deploy_from_template_details.vcenter_vm_snapshot = 'name/shanpshot'
        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_from_linked_clone(
            si=self.si,
            data_holder=deploy_from_template_details,
            vcenter_data_model=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name,
                         'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def _create_vcenter_resource_context(self):
        vc = VMwarevCenterResourceModel()
        vc.user = '******'
        vc.password = '******'
        vc.default_dvswitch = 'switch1'
        vc.holding_network = 'anetwork'
        vc.vm_cluster = 'Quali'
        vc.vm_location = 'Quali'
        vc.vm_resource_pool = 'Quali'
        vc.vm_storage = 'Quali'
        vc.shutdown_method = 'hard'
        vc.ovf_tool_path = 'C\\program files\ovf'
        vc.execution_server_selector = ''
        vc.reserved_networks = 'vlan65'
        vc.default_datacenter = 'QualiSB'

        return vc

    def test_vm_deployer_error(self):
        self.clone_res.error = Mock()

        self.pv_service.CloneVmParameters = Mock(
            return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        deploy_from_template_details = DeployFromTemplateDetails(
            vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        vcenter_data_model = self._create_vcenter_resource_context()

        self.assertRaises(Exception, self.deployer.deploy_from_template,
                          self.si, Mock(), deploy_from_template_details,
                          vcenter_data_model)
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_vm_deployer_image(self):
        params = DeployDataHolder({
            'app_name': 'appName',
            'vcenter_name': 'vCenter',
            'image_params': {
                "vcenter_image": "c:\image.ovf",
                "vm_cluster": "QualiSB Cluster",
                "vm_resource_pool": "LiverPool",
                "vm_storage": "eric ds cluster",
                "default_datacenter": "QualiSB",
                "vm_location": "vm_location",
                "auto_power_on": 'False',
                "vcenter_name": 'vCenter',
                "vcenter_image_arguments":
                "--compress=9,--schemaValidate,--etc",
                'ip_regex': '',
                'refresh_ip_timeout': '10',
                'auto_power_on': 'True',
                'auto_power_off': 'True',
                'wait_for_ip': 'True',
                'auto_delete': 'True',
                'autoload': 'True'
            }
        })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.cs_helper.get_connection_details = Mock(return_value=connectivity)

        session = Mock()
        vcenter_data_model = Mock()
        vcenter_data_model.default_datacenter = 'qualisb'
        resource_context = Mock()

        res = self.deployer.deploy_from_image(
            si=self.si,
            logger=Mock(),
            session=session,
            vcenter_data_model=vcenter_data_model,
            data_holder=params,
            resource_context=resource_context)

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name, params.vcenter_name)

    def test_vm_deployer_image_no_res(self):
        self.image_deployer.deploy_image = Mock(return_value=None)
        params = DeployDataHolder({
            "image_url":
            "c:\image.ovf",
            "cluster_name":
            "QualiSB Cluster",
            "resource_pool":
            "LiverPool",
            "datastore_name":
            "eric ds cluster",
            "datacenter_name":
            "QualiSB",
            "power_on":
            False,
            "app_name":
            "appName",
            "user_arguments": ["--compress=9", "--schemaValidate", "--etc"]
        })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si,
                          params, connectivity)

    def test_vm_deployer_image_no_vm(self):
        self.pv_service.find_vm_by_name = Mock(return_value=None)
        params = DeployDataHolder({
            "image_url":
            "c:\image.ovf",
            "cluster_name":
            "QualiSB Cluster",
            "resource_pool":
            "LiverPool",
            "datastore_name":
            "eric ds cluster",
            "datacenter_name":
            "QualiSB",
            "power_on":
            False,
            "app_name":
            "appName",
            "user_arguments": ["--compress=9", "--schemaValidate", "--etc"]
        })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si,
                          params, connectivity)
Exemplo n.º 8
0
class TestVirtualMachineDeployer(TestCase):
    def setUp(self):
        self.name = 'name'
        self.uuid = 'uuid'
        self.name_gen = Mock(return_value=self.name)
        self.pv_service = Mock()
        self.si = Mock()
        self.clone_parmas = Mock()
        self.clone_res = Mock()
        self.clone_res.error = None
        self.clone_res.vm = Mock()
        self.clone_res.vm.summary = Mock()
        self.clone_res.vm.summary.config = Mock()
        self.clone_res.vm.summary.config.uuid = self.uuid
        self.pv_service.CloneVmParameters = Mock(return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        self.image_deployer = Mock()
        self.image_deployer.deploy_image = Mock(return_value=True)
        self.vm = Mock()
        self.vm.config = Mock()
        self.vm.config.uuid = self.uuid
        self.pv_service.find_vm_by_name = Mock(return_value=self.vm)
        self.cs_helper = Mock()
        self.deployer = VirtualMachineDeployer(self.pv_service, self.name_gen, self.image_deployer, self.cs_helper,
                                               ResourceModelParser())

    def test_vm_deployer(self):
        deploy_from_template_details = DeployFromTemplateDetails(vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        resource_context = self._create_vcenter_resource_context()

        res = self.deployer.deploy_from_template(
            si=self.si,
            data_holder=deploy_from_template_details,
            resource_context=resource_context,
            logger=Mock())

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name, 'vcenter_resource_name')
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def _create_vcenter_resource_context(self):
        resource_context = create_autospec(ResourceInfo)
        resource_context.ResourceModelName = 'VMwarev Center'
        resource_context.ResourceAttributes = {'User': '******',
                                               'Password': '******',
                                               'Default dvSwitch': 'switch1',
                                               'Holding Network': 'anetwork',
                                               'Default Port Group Location': 'Quali',
                                               'VM Cluster': 'Quali',
                                               'VM Location': 'Quali',
                                               'VM Resource Pool': 'Quali',
                                               'VM Storage': 'Quali',
                                               'Shutdown Method': 'hard',
                                               'OVF Tool Path': 'C\\program files\ovf',
                                               'Execution Server Selector': '',
                                               'Reserved Networks': 'vlan65',
                                               'Default Datacenter': 'QualiSB'
                                               }
        return resource_context

    def test_vm_deployer_error(self):
        self.clone_res.error = Mock()

        self.pv_service.CloneVmParameters = Mock(return_value=self.clone_parmas)
        self.pv_service.clone_vm = Mock(return_value=self.clone_res)
        deploy_from_template_details = DeployFromTemplateDetails(vCenterVMFromTemplateResourceModel(), 'VM Deployment')
        deploy_from_template_details.template_resource_model.vcenter_name = 'vcenter_resource_name'

        resource_context = self._create_vcenter_resource_context()

        self.assertRaises(Exception, self.deployer.deploy_from_template, self.si, Mock(), deploy_from_template_details,
                          resource_context)
        self.assertTrue(self.pv_service.CloneVmParameters.called)

    def test_vm_deployer_image(self):
        params = DeployDataHolder({
            'app_name': 'appName',
            'vcenter_name': 'vCenter',
            'image_params':
                {
                    "vcenter_image": "c:\image.ovf",
                    "vm_cluster": "QualiSB Cluster",
                    "vm_resource_pool": "LiverPool",
                    "vm_storage": "eric ds cluster",
                    "default_datacenter": "QualiSB",
                    "vm_location": "vm_location",
                    "auto_power_on": 'False',
                    "vcenter_name": 'vCenter',
                    "vcenter_image_arguments": "--compress=9,--schemaValidate,--etc",
                    'ip_regex': '',
                    'refresh_ip_timeout': '10',
                    'auto_power_on': 'True',
                    'auto_power_off': 'True',
                    'wait_for_ip': 'True',
                    'auto_delete': 'True',
                    'autoload': 'True'
                }
        })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.cs_helper.get_connection_details = Mock(return_value=connectivity)

        session = Mock()
        vcenter_data_model = Mock()
        vcenter_data_model.default_datacenter = 'qualisb'
        resource_context = Mock()

        res = self.deployer.deploy_from_image(si=self.si,
                                              logger=Mock(),
                                              session=session,
                                              vcenter_data_model=vcenter_data_model,
                                              data_holder=params,
                                              resource_context=resource_context)

        self.assertEqual(res.vm_name, self.name)
        self.assertEqual(res.vm_uuid, self.uuid)
        self.assertEqual(res.cloud_provider_resource_name,
                         params.vcenter_name)

    def test_vm_deployer_image_no_res(self):
        self.image_deployer.deploy_image = Mock(return_value=None)
        params = DeployDataHolder(
            {
                "image_url": "c:\image.ovf",
                "cluster_name": "QualiSB Cluster",
                "resource_pool": "LiverPool",
                "datastore_name": "eric ds cluster",
                "datacenter_name": "QualiSB",
                "power_on": False,
                "app_name": "appName",
                "user_arguments": ["--compress=9",
                                   "--schemaValidate", "--etc"
                                   ]
            })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si, params, connectivity)

    def test_vm_deployer_image_no_vm(self):
        self.pv_service.find_vm_by_name = Mock(return_value=None)
        params = DeployDataHolder(
            {
                "image_url": "c:\image.ovf",
                "cluster_name": "QualiSB Cluster",
                "resource_pool": "LiverPool",
                "datastore_name": "eric ds cluster",
                "datacenter_name": "QualiSB",
                "power_on": False,
                "app_name": "appName",
                "user_arguments": ["--compress=9",
                                   "--schemaValidate", "--etc"
                                   ]
            })

        connectivity = Mock()
        connectivity.address = 'vcenter ip or name'
        connectivity.user = '******'
        connectivity.password = '******'

        self.assertRaises(Exception, self.deployer.deploy_from_image, self.si, params, connectivity)