From 73570429745d09b6e4c62f148ebd6c2fbc1a97e6 Mon Sep 17 00:00:00 2001
From: Attila Farkas <x394097@fi.muni.cz>
Date: Tue, 23 Jul 2019 20:05:59 +0200
Subject: [PATCH] first version

---
 README.md                | 21 +++++++++++-
 generate.py              | 53 +++++++++++++++++++++++++++++
 name_mapping/vagrant.yml | 73 ++++++++++++++++++++++++++++++++++++++++
 templates/base           | 23 +++++++++++++
 test.yaml                | 43 +++++++++++++++++++++++
 5 files changed, 212 insertions(+), 1 deletion(-)
 create mode 100644 generate.py
 create mode 100644 name_mapping/vagrant.yml
 create mode 100644 templates/base
 create mode 100644 test.yaml

diff --git a/README.md b/README.md
index 9920406..a4faf2f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,22 @@
 # sandbox-creator
 
-A next generation of https://gitlab.ics.muni.cz/KYPO-content/KYPO-Creator
\ No newline at end of file
+A next generation of https://gitlab.ics.muni.cz/KYPO-content/KYPO-Creator
+
+
+generate.py is a python program that generates a vagrant source file from a definition in yaml.
+
+### Usage:
+1. Clone the project.
+2. Navigate to the project folder.
+3. Type `$ python generate.py {yaml_file.yaml} >> Vagrantfile`. There is a test yaml file in the repository called test.yaml.
+4. Run `$ vagrant up`
+
+### Implemented attribute types:
+- all simple string vagrant attributes
+- a simple network (assigning an ip address to a device)
+
+### Not implemented yet:
+- numeric and other vagrant attributes
+- VirtualBox and OpenStack attributes
+- other network configuration
+
diff --git a/generate.py b/generate.py
new file mode 100644
index 0000000..7a66393
--- /dev/null
+++ b/generate.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python3
+
+import sys
+import yaml
+import jinja2
+
+if (len(sys.argv) != 2):
+    print ("Error: Expecting 1 argument (yml file).")
+    sys.exit();
+
+try:
+    ymlfile = open(str(sys.argv[1]))
+    yml = yaml.safe_load(ymlfile)
+except IOError:
+    print ("Error: file does not exist.")
+
+try:
+    v_mappings_file = open("name_mapping/vagrant.yml")
+    vagrant_mappings = yaml.safe_load(v_mappings_file)
+except IOError:
+    print ("Error: cannot find mappings.")
+
+# Converts yaml attribute names to vagrant attribute names.
+def do_mapping(name):
+    return vagrant_mappings[name]
+
+def find_ip(name):
+    for net_mapping in yml['net_mappings']:
+        if (net_mapping['host'] == name):
+            return net_mapping['ip']
+
+devices = {}
+
+for host in yml['hosts']:
+    devices[host['name']] = []
+    for key, value in host.items():
+        if (key != 'name'):
+            devices[host['name']].append('device.' + str(do_mapping(key)) + ' = \"' + str(value) + '\"')
+    if (yml['net_mappings']):      
+        devices[host['name']].append('device.vm.network :private_network, ip: \"' + str(find_ip(host['name'])) + '\"')
+
+templateLoader = jinja2.FileSystemLoader(searchpath="templates")
+templateEnv = jinja2.Environment(loader=templateLoader, trim_blocks=True)
+baseTemplate = templateEnv.get_template("base")
+output = baseTemplate.render(devices = devices)
+print (output)
+
+#vagrantfile = open('Vagrantfile','w')
+#vagrantfile.write(output)
+
+
+
+
diff --git a/name_mapping/vagrant.yml b/name_mapping/vagrant.yml
new file mode 100644
index 0000000..cdf5060
--- /dev/null
+++ b/name_mapping/vagrant.yml
@@ -0,0 +1,73 @@
+base_mac: vm.base_mac
+base_address: vm.base_address
+boot_timeout: vm.boot_timeout
+base_box: vm.box
+box_check_update: vm.box_check_update
+box_download_checksum: vm.box_download_checksum
+box_download_checksum_type: vm.box_download_checksum_type
+box_download_client_cert: vm.box_download_client_cert
+box_download_ca_cert: vm.box_download_ca_cert
+box_download_ca_path: vm.box_download_ca_path
+box_download_insecure: vm.box_download_insecure
+box_download_location_trusted: vm.box_download_location_trusted
+box_url: vm.box_url
+box_version: vm.box_version
+communicator: vm.communicator
+graceful_halt_timeout: vm.graceful_halt_timeout
+guest: vm.guest
+hostname: vm.hostname
+ignore_box_vagrantfile: vm.ignore_box_vagrantfile
+network: vm.network
+post_up_message: vm.post_up_message
+provider: vm.provider
+provision: vm.provision
+synced_folder: vm.synced_folder
+usable_port_range: vm.usable_port_range
+ssh_compression: ssh.compression
+ssh_config: ssh.config
+ssh_dsa_authentication: ssh.dsa_authentication
+ssh_export_command_template: ssh.export_command_template
+ssh_extra_args: ssh.extra_args
+ssh_forward_agent: ssh.forward_agent
+ssh_forward_env: ssh.forward_env
+ssh_forward_x11: ssh.forward_x11
+ssh_guest_port: ssh.guest_port
+ssh_host: ssh.host
+ssh_insert_key: ssh.insert_key
+ssh_keep_alive: ssh.keep_alive
+ssh_keys_only: ssh.keys_only
+ssh_paranoid: ssh.paranoid
+ssh_password: ssh.password
+ssh_port: ssh.port
+ssh_private_key_path: ssh.private_key_path
+ssh_proxy_command: ssh.proxy_command
+ssh_pty: ssh.pty
+ssh_remote_user: ssh.remote_user
+ssh_shell: ssh.shell 
+ssh_sudo_command: ssh.sudo_command
+ssh_username: ssh.username
+ssh_verify_host_key: ssh.verify_host_key
+winrm_username: winrm.username
+winrm_password: winrm.password
+winrm_host: winrm.host
+winrm_port: winrm.port
+winrm_guest_port: winrm.guest_port
+winrm_transport: winrm.transport
+winrm_basic_auth_only: winrm.basic_auth_only
+winrm_ssl_peer_verification: winrm.ssl_peer_verification
+winrm_timeout: winrm.timeout 
+winrm_retry_limit: winrm.retry_limit
+winrm_retry_delay: winrm.retry_delay
+winrm_codepage: winrm.codepage
+winssh_forward_agent: winssh.forward_agent
+winssh_forward_env: winssh.forward_env
+winssh_proxy_command: winssh.proxy_command
+winssh_keep_alive: winssh.keep_alive
+winssh_shell: winssh.shell
+winssh_export_command_template: winssh.export_command_template
+winssh_sudo_command: winssh.sudo_command
+winssh_upload_directory: winssh.upload_directory
+vagrant_host: vagrant.host
+vagrant_plugins: vagrant.plugins
+vagrant_sensitive: vagrant.sensitive
+
diff --git a/templates/base b/templates/base
new file mode 100644
index 0000000..08542cb
--- /dev/null
+++ b/templates/base
@@ -0,0 +1,23 @@
+# Generated vagrant file
+#
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+{# Macro that prints out attributes of a device #}
+{% macro printAttributes(device_name) %}
+{% for command in devices[device_name] %}
+    {{ command }}
+{% endfor %}
+{% endmacro %}
+
+{# Device definitions #}
+Vagrant.configure("2") do |config|
+{% for name, attributes in devices.iteritems() %}
+
+  # device: {{ name }}
+  config.vm.define "{{ name }}" do |device|
+{{ printAttributes(name) }}
+  end
+{% endfor %}
+
+end
diff --git a/test.yaml b/test.yaml
new file mode 100644
index 0000000..695a960
--- /dev/null
+++ b/test.yaml
@@ -0,0 +1,43 @@
+provisioning: Openstack
+
+name: small-sandbox
+hosts:
+  - name: server
+    base_box: ubuntu/bionic64
+
+  - name: home
+    base_box: ubuntu/bionic64
+
+routers:
+  - name: server-router
+    cidr: 100.100.100.0/29
+  - name: home-router
+    cidr: 200.100.100.0/29
+
+networks:
+  - name: server-switch
+    cidr: 10.10.20.0/24
+
+  - name: home-switch
+    cidr: 10.10.30.0/24
+
+net_mappings:
+    - host: server
+      network: server-switch
+      ip: 10.10.20.5
+    - host: home
+      network: home-switch
+      ip: 10.10.30.5
+
+router_mappings:
+    - router: server-router
+      network: server-switch
+      ip: 10.10.20.1
+    - router: home-router
+      network: home-switch
+      ip: 10.10.30.1
+
+block_internet: []
+include_user_access: 
+    - server-switch
+    - home-switch
-- 
GitLab