1
0
mirror of https://github.com/gryf/boxpy.git synced 2026-03-25 06:33:32 +01:00

3 Commits

Author SHA1 Message Date
cdcb7ffdce Added implementation for custom image. 2022-11-17 20:34:13 +01:00
9658a9ef36 Add commandline options for providing custom image.
Two new commandline options are added: image and default-user. When
image parameter has been add there are implications that:

- default-user is also provided by commandline - regardless it is
  already present in yaml config
- distro parameter is ignored
- custom username, which might be provided by yaml file will become
  default-user if absent.

All of that is the consequence, that by providing custom qcow2 image
there is no easy way to determine what operating system is passed by,
therefore it is purely declarative way of creating VM with such image.
2022-11-17 20:27:58 +01:00
706dfe8688 Decrease memory/disk size of default vm 2022-11-17 19:22:16 +01:00
2 changed files with 39 additions and 17 deletions

View File

@@ -55,7 +55,7 @@ or simply link it somewhere in the path:
$ chmod +x ~/bin/boxpy
and now you can issue some command. For example, to spin up a VM with Ubuntu
18.04 with one CPU, 2GB of memory and 10GB of disk:
18.04 with one CPU, 1GB of memory and 6GB of disk:
.. code:: shell-session

54
box.py
View File

@@ -46,9 +46,9 @@ ssh:
emit_keys_to_console: false
boxpy_data:
cpus: 1
disk_size: 10240
disk_size: 6144
key: ~/.ssh/id_rsa
memory: 2048
memory: 1024
'''
COMPLETIONS = {'bash': '''\
_boxpy() {
@@ -138,9 +138,9 @@ _boxpy() {
fi
;;
create|rebuild)
items=(--cpus --disable-nested --disk-size --distro --forwarding
--image --key --memory --hostname --port --config --version
--type)
items=(--cpus --disable-nested --disk-size --default-user --distro
--forwarding --image --key --memory --hostname --port --config
--version --type)
if [[ ${prev} == ${cmd} ]]; then
if [[ ${cmd} = "rebuild" ]]; then
_vms_comp vms
@@ -419,6 +419,10 @@ class Config:
continue
setattr(self, attr, str(val))
# sort out case, where there is image/default-user provided
if self.image:
self._update_distros_with_custom_image()
# set distribution and version if not specified by user
if not self.distro:
self.distro = 'ubuntu'
@@ -552,16 +556,6 @@ class Config:
continue
setattr(self, key, str(val))
# update distros dict with custom entry if there is at least image
if conf.get('boxpy_data') and conf['boxpy_data'].get('image'):
custom = {'username': conf['boxpy_data'].get('default_user'),
'realname': 'custom os',
'img_class': CustomImage,
'amd64': 'x86_64',
'image': conf['boxpy_data']['image'],
'default_version': '0'}
DISTROS['custom'] = custom
# remove boxpy_data since it will be not needed on the guest side
if conf.get('boxpy_data'):
if conf['boxpy_data'].get('advanced'):
@@ -570,6 +564,18 @@ class Config:
self._conf = conf
def _update_distros_with_custom_image(self):
self.image = os.path.abspath(self.image)
self.distro = 'custom'
if not self.username:
self.username = self.default_user
DISTROS['custom'] = {'username': self.default_user,
'realname': 'custom os',
'img_class': CustomImage,
'amd64': 'x86_64',
'image': self.image,
'default_version': '0'}
def _update(self, source, update):
for key, val in update.items():
if isinstance(val, collections.abc.Mapping):
@@ -1192,7 +1198,7 @@ def vmcreate(args, conf=None):
if not vbox.create_controller('SATA', 'sata'):
return 4
for key in ('distro', 'hostname', 'key', 'version', 'image'):
for key in ('distro', 'hostname', 'key', 'version', 'image', 'username'):
if getattr(conf, key) is None:
continue
if not vbox.setextradata(key, getattr(conf, key)):
@@ -1526,10 +1532,16 @@ def main():
help="Alternative user-data template filepath")
create.add_argument('-d', '--distro', help="Image name. 'ubuntu' is "
"default")
create.add_argument('-e', '--default-user', help="Default cloud-init user "
"to be used with custom image (--image param). "
"Without image it will make no effect.")
create.add_argument('-f', '--forwarding', action='append', help="expose "
"port from VM to the host. It should be in format "
"'hostport:vmport'. this option can be used multiple "
"times for multiple ports.")
create.add_argument('-i', '--image', help="custom qcow2 image filepath. "
"Note, that it requires to provide --default-user as "
"well.")
create.add_argument('-k', '--key', help="SSH key to be add to the config "
"drive. Default ~/.ssh/id_rsa")
create.add_argument('-m', '--memory', help="amount of memory in "
@@ -1571,10 +1583,16 @@ def main():
rebuild.add_argument('-c', '--config',
help="Alternative user-data template filepath")
rebuild.add_argument('-d', '--distro', help="Image name.")
rebuild.add_argument('-e', '--default-user', help="Default cloud-init "
"user to be used with custom image (--image param). "
"Without image it will make no effect.")
rebuild.add_argument('-f', '--forwarding', action='append', help="expose "
"port from VM to the host. It should be in format "
"'hostport:vmport'. this option can be used multiple "
"times for multiple ports.")
rebuild.add_argument('-i', '--image', help="custom qcow2 image filepath. "
"Note, that it requires to provide --default-user as "
"well.")
rebuild.add_argument('-k', '--key',
help='SSH key to be add to the config drive')
rebuild.add_argument('-m', '--memory', help='amount of memory in '
@@ -1617,6 +1635,10 @@ def main():
args = parser.parse_args()
if 'image' in args and 'default_user' not in args:
parser.error('Parameter --image requires --default-user')
return 22
LOG.set_verbose(args.verbose, args.quiet)
if 'func' not in args and args.version: