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)
def compute_models(self): self.log("Getting compute models") return ComputeManagementClient.models("2017-03-30")
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")