Converted existing markdown documentation to RST format.
[snaps.git] / docs / how-to-use / VirtEnvDeploy.rst
diff --git a/docs/how-to-use/VirtEnvDeploy.rst b/docs/how-to-use/VirtEnvDeploy.rst
new file mode 100644 (file)
index 0000000..7f55f0c
--- /dev/null
@@ -0,0 +1,275 @@
+Overview
+========
+
+The main purpose of this project is to enable one to describe a virtual environment in a YAML file and enable the
+user to deploy it to an OpenStack cloud in a repeatable manner. There are also options to un-deploy that same
+environment by leveraging the original YAML file.
+
+To deploy/clean virtual environments
+====================================
+
+-  Clone Repository
+
+   -  git clone https://gerrit.cablelabs.com/snaps-provisioning
+
+-  Install Library
+
+   -  pip install -e /
+
+-  Deploy
+
+   -  cd
+   -  python snaps/deploy\_venv.py -e -d
+   -  Working example:
+
+::
+
+    python deploy_venv.py -e <path to repo>/examples/complex-network/deploy-complex-network.yaml -d
+
+-  Clean
+
+   -  python deploy\_venv.py -e -c
+   -  Working example (cleanup of a previously deployed virtual
+      environment where the VM has Yardstick installed):
+
+::
+
+    python deploy_venv.py -e <path to repo>/examples/complex-network/deploy-complex-network.yaml -c
+
+Environment Configuration YAML File
+===================================
+
+The configuration file used to deploy and provision a virtual environment has been designed to describe the required
+images, networks, SSH public and private keys, associated VMs, as well as any required post deployment provisioning
+tasks.
+
+\*\*\* Please note that many of the more esoteric optional supported
+attributes still have not been fully tested. ***
+*** Some of the nested bullets are being hidden by GitLabs, please see
+doc/VirtEnvDeploy.md.\*\*\*
+
+-  openstack: the top level tag that denotes configuration for the
+   OpenStack components
+
+   -  connection: - contains the credentials and endpoints required to
+      connect with OpenStack
+   -  username: - the project's user (required)
+   -  password: - the tentant's user password (required)
+   -  auth\_url: - the URL to the OpenStack APIs (required)
+   -  project\_name: - the name of the OpenStack project for the user
+      (required)
+   -  http\_proxy: - the {{ host }}:{{ port }} of the proxy server the
+      HTTPPhotoman01(optional)
+   -  images: - describes each image
+   -  image:
+
+      -  name: The unique image name. If the name already exists for
+         your project, a new one will not be created (required)
+      -  format: The format type of the image i.e. qcow2 (required)
+      -  download\_url: The HTTP download location of the image file
+         (required)
+      -  nic\_config\_pb\_loc: The file location relative to the CWD
+         (python directory) to the Ansible Playbook used to configure
+         VMs with more than one port. VMs get their first NIC configured
+         for free while subsequent ones are not. This value/script will
+         only be leveraged when necessary. Centos has been supported
+         with
+         "provisioning/ansible/centos-network-setup/configure\_host.yml".
+
+   -  networks:
+   -  network:
+
+      -  name: The name of the network to be created. If one already
+         exists, a new one will not be created (required)
+      -  admin\_state\_up: T\|F (default True)
+      -  shared: (optional)
+      -  project\_name: Name of the project who owns the network. Note:
+         only administrative users can specify projects other than their
+         own (optional)
+      -  external: T\|F whether or not network is external (default
+         False)
+      -  network\_type: The type of network to create. (optional)
+      -  subnets:
+      -  subnet:
+
+         -  name: The name of the network to be created. If one already
+            exists, a new one will not be created. Note: although
+            OpenStack allows for multiple subnets to be applied to any
+            given network, we have not included support as our current
+            use cases does not utilize this functionality (required)
+         -  cidr: The subnet mask value (required)
+         -  dns\_nameservers: A list of IP values used for DNS
+            resolution (default: 8.8.8.8)
+         -  ip\_version: 4\|6 (default: 4)
+         -  project\_name: Name of the project who owns the network.
+            Note: only administrative users can specify projects other
+            than their own (optional)
+         -  start: The start address for allocation\_pools (optional)
+         -  end: The ending address for allocation\_pools (optional)
+         -  gateway\_ip: The IP address to the gateway (optional)
+         -  enable\_dhcp: T\|F (optional)
+         -  dns\_nameservers: List of DNS server IPs
+         -  host\_routes: A list of host route dictionaries (optional)
+            i.e.:
+            ``yaml    "host_routes":[    {    "destination":"0.0.0.0/0",    "nexthop":"123.456.78.9"    },    {    "destination":"192.168.0.0/24",    "nexthop":"192.168.0.1"    }    ]``
+         -  destination: The destination for a static route (optional)
+         -  nexthop: The next hop for the destination (optional)
+         -  ipv6\_ra\_mode: Valid values: "dhcpv6-stateful",
+            "dhcpv6-stateless", and "slaac" (optional)
+         -  ipv6\_address\_mode: Valid values: "dhcpv6-stateful",
+            "dhcpv6-stateless", and "slaac" (optional)
+
+   -  routers:
+
+      -  router:
+      -  name: The name of the router to be created. If one already
+         exists, a new one will not be created (required)
+      -  project\_name: Name of the project who owns the network. Note:
+         only administrative users can specify projects other than their
+         own (optional)
+      -  internal\_subnets: A list of subnet names on which the router
+         will be placed (optional)
+      -  external\_gateway: A dictionary containing the external gateway
+         parameters: "network\_id", "enable\_snat",
+         "external\_fixed\_ips" (optional)
+      -  interfaces: A list of port interfaces to create to other
+         subnets (optional)
+
+         -  port (Leverages the same class/structure as port objects on
+            VM instances. See port definition below for a
+            full accounting of the port attributes. The ones listed
+            below are generally used for routers)
+
+            -  name: The name given to the new port (must be unique for
+               project) (required)
+            -  network\_name: The name of the new port's network
+               (required)
+            -  ip\_addrs: A list of k/v pairs (optional)
+            -  subnet\_name: the name of a subnet that is on the port's
+               network
+            -  ip: An IP address of the associated subnet to assign to
+               the new port (optional but generally required for router
+               interfaces)
+
+   -  keypairs:
+
+      -  keypair:
+      -  name: The name of the keypair to be created. If one already
+         exists, a new one will not be created but simply loaded from
+         its configured file location (required)
+      -  public\_filepath: The path to where the generated public key
+         will be stored if it does not exist (optional but really
+         required for provisioning purposes)
+      -  private\_filepath: The path to where the generated private key
+         will be stored if it does not exist (optional but really
+         required for provisioning purposes)
+
+   -  instances:
+
+      -  instance:
+      -  name: The unique instance name for project. (required)
+      -  flavor: Must be one of the preconfigured flavors (required)
+      -  imageName: The name of the image to be used for deployment
+         (required)
+      -  keypair\_name: The name of the keypair to attach to instance
+         (optional but required for NIC configuration and Ansible
+         provisioning)
+      -  sudo\_user: The name of a sudo\_user that is attached to the
+         keypair (optional but required for NIC configuration and
+         Ansible provisioning)
+      -  vm\_boot\_timeout: The number of seconds to block waiting for
+         an instance to deploy and boot (default 900)
+      -  vm\_delete\_timeout: The number of seconds to block waiting for
+         an instance to be deleted (default 300)
+      -  ssh\_connect\_timeout: The number of seconds to block waiting
+         for an instance to achieve an SSH connection (default 120)
+      -  ports: A list of port configurations (should contain at least
+         one)
+      -  port: Denotes the configuration of a NIC
+
+         -  name: The unique port name for project (required)
+         -  network\_name: The name of the network to which the port is
+            attached (required)
+         -  ip\_addrs: Static IP addresses to be added to the port by
+            subnet (optional)
+         -  subnet\_name: The name of the subnet
+         -  ip: The assigned IP address (when null, OpenStack will
+            assign an IP to the port)
+         -  admin\_state\_up: T\|F (default True)
+         -  project\_name: The name of the project who owns the network.
+            Only administrative users can specify a the project ID other
+            than their own (optional)
+         -  mac\_address: The desired MAC for the port (optional)
+         -  fixed\_ips: A dictionary that allows one to specify only a
+            subnet ID, OpenStack Networking allocates an available IP
+            from that subnet to the port. If you specify both a subnet
+            ID and an IP address, OpenStack Networking tries to allocate
+            the specified address to the port. (optional)
+         -  seurity\_groups: A list of security group IDs (optional)
+         -  allowed\_address\_pairs: A dictionary containing a set of
+            zero or more allowed address pairs. An address pair contains
+            an IP address and MAC address. (optional)
+         -  opt\_value: The extra DHCP option value (optional)
+         -  opt\_name: The extra DHCP option name (optional)
+         -  device\_owner: The ID of the entity that uses this port. For
+            example, a DHCP agent (optional)
+         -  device\_id: The ID of the device that uses this port. For
+            example, a virtual server (optional)
+
+   -  floating\_ips: list of floating\_ip configurations (optional)
+
+      -  floating\_ip:
+      -  name: Must be unique for VM instance (required)
+      -  port\_name: The name of the port requiring access to the
+         external network (required)
+      -  subnet\_name: The name of the subnet contains the IP address on
+         the port on which to create the floating IP (optional)
+      -  router\_name: The name of the router connected to an external
+         network used to attach the floating IP (required)
+      -  provisioning: (True\|False) Denotes whether or not this IP can
+         be used for Ansible provisioning (default True)
+
+-  ansible: Each set of attributes below are contained in a list
+
+   -  playbook\_location: Full path or relative to the directory in
+      which the deployment file resides (required)
+   -  hosts: A list of hosts to which the playbook will be executed
+      (required)
+   -  variables: Should your Ansible scripts require any substitution
+      values to be applied with Jinga2templates, the values defined here
+      will be used to for substitution
+   -  tag name = substitution variable names. For instance, for any file
+      being pushed to the host being provisioned containing a value such
+      as {{ foo }}, you must specify a tag name of "foo"
+
+      -  vm\_name:
+      -  type: string\|port\|os\_creds\|vm-attr (note: will need to make
+         changes to deploy\_venv.py#\_\_get\_variable\_value() for
+         additional support)
+      -  when type == string, an tag name "value" must exist and its
+         value will be used for template substituion
+      -  when type == port, custom code has been written to extract
+         certain assigned values to the port:
+
+         -  vm\_name: must correspond to a VM's name as configured in
+            this file
+         -  port\_name: The name of the port from which to extract the
+            substitution values (required)
+         -  port\_value: The port value. Currently only supporting
+            "mac\_address" and "ip\_address" (only the first)
+
+      -  when type == os\_creds, custom code has been written to extract
+         the file's connection values:
+
+         -  username: connection's user
+         -  password: connection's password
+         -  auth\_url: connection's URL
+         -  project\_name: connection's project
+
+      -  when type == vm-attr, custom code has been written to extract
+         the following attributes from the vm:
+
+         -  vm\_name: must correspond to a VM's name as configured in
+            this file
+         -  value -> floating\_ip: is currently the only vm-attr
+            supported