def build(self, kernel: Artifact, disks: [DiskArtifact], ssh_key: Artifact, config: Artifact, enable_diff_snapshots=False): """Build a fresh microvm.""" self.init_root_path() vm = init_microvm(self.root_path, self.bin_cloner_path) # Link the microvm to kernel, rootfs, ssh_key artifacts. vm.kernel_file = kernel.local_path() vm.rootfs_file = disks[0].local_path() # Download ssh key into the microvm root. ssh_key.download(self.root_path) vm.ssh_config['ssh_key_path'] = ssh_key.local_path() os.chmod(vm.ssh_config['ssh_key_path'], 0o400) # Start firecracker. vm.spawn() with open(config.local_path()) as microvm_config_file: microvm_config = json.load(microvm_config_file) # Apply the microvm artifact configuration vm.basic_config(vcpu_count=int(microvm_config['vcpu_count']), mem_size_mib=int(microvm_config['mem_size_mib']), ht_enabled=bool(microvm_config['ht_enabled']), track_dirty_pages=enable_diff_snapshots, boot_args='console=ttyS0 reboot=k panic=1') return vm
def build(self, kernel: Artifact, disks: [DiskArtifact], ssh_key: Artifact, config: Artifact, enable_diff_snapshots=False, cpu_template=None): """Build a fresh microvm.""" vm = init_microvm(self.root_path, self.bin_cloner_path, self._fc_binary, self._jailer_binary) # Link the microvm to kernel, rootfs, ssh_key artifacts. vm.kernel_file = kernel.local_path() vm.rootfs_file = disks[0].local_path() # Start firecracker. vm.spawn() # Download ssh key into the microvm root. ssh_key.download(self.root_path) vm.ssh_config['ssh_key_path'] = ssh_key.local_path() os.chmod(vm.ssh_config['ssh_key_path'], 0o400) vm.create_tap_and_ssh_config(host_ip=DEFAULT_HOST_IP, guest_ip=DEFAULT_GUEST_IP, netmask_len=DEFAULT_NETMASK, tapname=DEFAULT_TAP_NAME) # TODO: propper network configuraiton with artifacts. guest_mac = net_tools.mac_from_ip(DEFAULT_GUEST_IP) response = vm.network.put( iface_id=DEFAULT_DEV_NAME, host_dev_name=DEFAULT_TAP_NAME, guest_mac=guest_mac, allow_mmds_requests=True, ) assert vm.api_session.is_status_no_content(response.status_code) with open(config.local_path()) as microvm_config_file: microvm_config = json.load(microvm_config_file) response = vm.basic_config(boot_args='console=ttyS0 reboot=k panic=1') # Apply the microvm artifact configuration and template. response = vm.machine_cfg.put( vcpu_count=int(microvm_config['vcpu_count']), mem_size_mib=int(microvm_config['mem_size_mib']), ht_enabled=bool(microvm_config['ht_enabled']), track_dirty_pages=enable_diff_snapshots, cpu_template=cpu_template, ) assert vm.api_session.is_status_no_content(response.status_code) # Reset root path so next microvm is built some place else. self.init_root_path() return vm
def build(self, kernel: Artifact, disks: [DiskArtifact], ssh_key: Artifact, config: Artifact, net_ifaces=None, enable_diff_snapshots=False, cpu_template=None, use_ramdisk=False): """Build a fresh microvm.""" vm = init_microvm(self.root_path, self.bin_cloner_path, self._fc_binary, self._jailer_binary) # Start firecracker. vm.spawn(use_ramdisk=use_ramdisk) # Link the microvm to kernel, rootfs, ssh_key artifacts. vm.kernel_file = kernel.local_path() vm.rootfs_file = disks[0].local_path() # copy rootfs to ramdisk if needed jailed_rootfs_path = vm.copy_to_jail_ramfs(vm.rootfs_file) if \ use_ramdisk else vm.create_jailed_resource(vm.rootfs_file) # Download ssh key into the microvm root. ssh_key.download(self.root_path) vm.ssh_config['ssh_key_path'] = ssh_key.local_path() os.chmod(vm.ssh_config['ssh_key_path'], 0o400) # Provide a default network configuration. if net_ifaces is None or len(net_ifaces) == 0: ifaces = [NetIfaceConfig()] else: ifaces = net_ifaces # Configure network interfaces using artifacts. for iface in ifaces: vm.create_tap_and_ssh_config(host_ip=iface.host_ip, guest_ip=iface.guest_ip, netmask_len=iface.netmask, tapname=iface.tap_name) guest_mac = net_tools.mac_from_ip(iface.guest_ip) response = vm.network.put( iface_id=iface.dev_name, host_dev_name=iface.tap_name, guest_mac=guest_mac, allow_mmds_requests=True, ) assert vm.api_session.is_status_no_content(response.status_code) with open(config.local_path()) as microvm_config_file: microvm_config = json.load(microvm_config_file) response = vm.basic_config( add_root_device=False, boot_args='console=ttyS0 reboot=k panic=1' ) # Add the root file system with rw permissions. response = vm.drive.put( drive_id='rootfs', path_on_host=jailed_rootfs_path, is_root_device=True, is_read_only=False ) assert vm.api_session \ .is_status_no_content(response.status_code), \ response.text # Apply the microvm artifact configuration and template. response = vm.machine_cfg.put( vcpu_count=int(microvm_config['vcpu_count']), mem_size_mib=int(microvm_config['mem_size_mib']), ht_enabled=bool(microvm_config['ht_enabled']), track_dirty_pages=enable_diff_snapshots, cpu_template=cpu_template, ) assert vm.api_session.is_status_no_content(response.status_code) vm.vcpus_count = int(microvm_config['vcpu_count']) # Reset root path so next microvm is built some place else. self.init_root_path() return vm