Beispiel #1
0
 def capture(self, container, image_name, overwrite_vhds=True):
     self.logger.info("Attempting to Capture Azure VM '%s'", self.name)
     # vm capture parameters resolved to correct class by API, url below to doc
     # https://github.com/Azure/azure-sdk-for-python/wiki/
     # Direct-access-to-%22models%22-is-deprecated
     params = ComputeManagementClient.models(
     ).VirtualMachineCaptureParameters(vhd_prefix=image_name,
                                       destination_container_name=container,
                                       overwrite_vhds=overwrite_vhds)
     self.stop()
     self.logger.info("Generalizing VM '%s'", self.name)
     operation = self._api.generalize(
         resource_group_name=self._resource_group, vm_name=self.name)
     self._wait_on_operation(operation)
     self.logger.info("Capturing VM '%s'", self.name)
     operation = self._api.capture(resource_group_name=self._resource_group,
                                   vm_name=self.name,
                                   parameters=params)
     return self._wait_on_operation(operation)
Beispiel #2
0
 def compute_models(self):
     self.log("Getting compute models")
     return ComputeManagementClient.models("2017-03-30")
Beispiel #3
0
    def deploy(self, vm_name, **vm_settings):
        # TODO: this method is huge, it should be broken up ...
        # TODO #2: check args of vm_settings better
        # TODO #3: possibly use compute images instead of blob images?
        resource_group = vm_settings.get('resource_group',
                                         self.system.resource_group)
        location = vm_settings.get('region_api', self.system.region)
        subnet = vm_settings['subnet_range']
        address_space = vm_settings['address_space']
        vnet_name = vm_settings['virtual_net']

        # checking whether passed vm size value is correct
        vm_sizes = {
            t.value
            for t in ComputeManagementClient.models().VirtualMachineSizeTypes
        }
        vm_size = vm_settings['vm_size']
        if vm_size not in vm_sizes:
            raise ValueError("wrong vm size %s passed. possible size: %s",
                             vm_size, ",".join(vm_sizes))

        storage_container = vm_settings['storage_container']
        # nsg_name = vm_settings['network_nsg']  # todo: check whether nsg is necessary at all

        # allocating public ip address for new vm
        public_ip_params = {
            'location': location,
            'public_ip_allocation_method': 'Dynamic'
        }
        public_ip = self.system.network_client.public_ip_addresses.create_or_update(
            resource_group_name=resource_group,
            public_ip_address_name=vm_name,
            parameters=public_ip_params).result()

        # creating virtual network
        virtual_networks = self.system.network_client.virtual_networks
        if vnet_name not in [
                v.name for v in virtual_networks.list(resource_group)
        ]:
            vnet_params = {
                'location': location,
                'address_space': {
                    'address_prefixes': [address_space]
                }
            }
            virtual_networks.create_or_update(
                resource_group_name=resource_group,
                virtual_network_name=vnet_name,
                parameters=vnet_params).result()

        # creating sub net
        subnet_name = 'default'
        subnets = self.system.network_client.subnets
        if subnet_name not in [
                v.name for v in subnets.list(resource_group, vnet_name)
        ]:
            vsubnet = subnets.create_or_update(
                resource_group_name=resource_group,
                virtual_network_name=vnet_name,
                subnet_name='default',
                subnet_parameters={
                    'address_prefix': subnet
                }).result()
        else:
            vsubnet = subnets.get(resource_group_name=resource_group,
                                  virtual_network_name=vnet_name,
                                  subnet_name='default')

        # creating network interface
        nic_params = {
            'location':
            location,
            'ip_configurations': [{
                'name': vm_name,
                'public_ip_address': public_ip,
                'subnet': {
                    'id': vsubnet.id
                }
            }]
        }

        def _create_or_update_nic():
            return self.system.network_client.network_interfaces.create_or_update(
                resource_group_name=resource_group,
                network_interface_name=vm_name,
                parameters=nic_params).result()

        try:
            nic = _create_or_update_nic()
        except CloudError:
            # Try one more time if we hit an error
            nic = _create_or_update_nic()

        # preparing os disk
        # todo: replace with copy disk operation
        self.system.copy_blob_image(self.name, vm_name,
                                    vm_settings['storage_account'],
                                    self._container, storage_container)
        image_uri = self.system.container_client.make_blob_url(
            container_name=storage_container, blob_name=vm_name)
        # creating virtual machine
        vm_parameters = {
            'location': location,
            'hardware_profile': {
                'vm_size': vm_size
            },
            'storage_profile': {
                'os_disk': {
                    'os_type':
                    'Linux',  # TODO: why is this hardcoded?
                    'name':
                    vm_name,
                    'vhd':
                    ComputeManagementClient.models().VirtualHardDisk(
                        uri='{}.vhd'.format(image_uri)),
                    'create_option':
                    ComputeManagementClient.models().DiskCreateOptionTypes.
                    attach,
                }
            },
            'network_profile': {
                'network_interfaces': [{
                    'id': nic.id
                }]
            },
        }
        vm = self.system.compute_client.virtual_machines.create_or_update(
            resource_group_name=resource_group,
            vm_name=vm_name,
            parameters=vm_parameters).result()
        vm = AzureInstance(system=self.system,
                           name=vm.name,
                           resource_group=vm_settings['resource_group'],
                           raw=vm)
        vm.wait_for_state(VmState.RUNNING)
        return vm
 def compute_models(self):
     self.log("Getting compute models")
     return ComputeManagementClient.models("2017-03-30")