frapposelli/vagrant-vcloud

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[Vagrant](http://www.vagrantup.com) provider for VMware vCloud Director® [![Gem Version](https://badge.fury.io/rb/vagrant-vcloud.svg)](http://badge.fury.io/rb/vagrant-vcloud) [![Code Climate](https://codeclimate.com/github/frapposelli/vagrant-vcloud/badges/gpa.svg)](https://codeclimate.com/github/frapposelli/vagrant-vcloud) [![Dependency Status](https://gemnasium.com/frapposelli/vagrant-vcloud.svg)](https://gemnasium.com/frapposelli/vagrant-vcloud)
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

Please note that this software is still Alpha/Beta quality and is not recommended for production usage.

We have a wide array of boxes available at [Vagrant Cloud](https://vagrantcloud.com/gosddc) you can use them directly or you can roll your own as you please, make sure to install VMware tools in it.

Starting from [version 0.4.2](../../releases/tag/v0.4.2), this plugin supports the universal [`vmware_ovf` box format](https://github.com/gosddc/packer-post-processor-vagrant-vmware-ovf/wiki/vmware_ovf-Box-Format), that is 100% portable between [vagrant-vcloud](https://github.com/frapposelli/vagrant-vcloud), [vagrant-vcenter](https://github.com/gosddc/vagrant-vcenter) and [vagrant-vcloudair](https://github.com/gosddc/vagrant-vcloudair), no more double boxes!.

If you're unsure about what are the correct network settings for your Vagrantfile make sure to check out the [Network Deployment Options](https://github.com/frapposelli/vagrant-vcloud/wiki/Network-Deployment-Options) wiki page.

Check the full releases changelog [here](../../releases)

Install
-------

Latest version can be installed by running the following command:

`vagrant plugin install vagrant-vcloud`

Vagrant will download all the required gems during the installation process.

After the install has completed a `vagrant up --provider=vcloud` will trigger the newly installed provider.

Upgrade
-------

If you already have vagrant-vcloud installed you can update to the latest version available by issuing:

`vagrant plugin update vagrant-vcloud`

Vagrant will take care of the upgrade process.

Configuration
-------------

Here's a sample Multi-VM Vagrantfile, please note that `vcloud.vdc_edge_gateway` and `vcloud.vdc_edge_gateway_ip` are required when you cannot access `vcloud.vdc_network_name` directly and there's an Organization Edge between your workstation and the vCloud Network.

```ruby
vapp = {
  name: 'My vApp name',
  org_name: 'OrganizationName',
  orgvdc_name: 'vDC_Name',
  orgvdccatalog_name: 'Vagrant',
  metadata: [ [ 'key', 'value' ] ],
  advanced_networking: true,
  networks: {
    org: [ 'Org_VDC_Network' ],
    vapp: [
      {
        name: 'MyNetwork',
        ip_subnet: '10.10.10.10/255.255.255.0'
      }
    ]
  },
  ovf_properties: {
    'test-variable' => 'true'
  }
}

nodes = [
  {
    hostname: 'web-vm',
    box: 'gosddc/precise32',
    memory: 512,
    cpus: 1,
    nested_hypervisor: false,
    add_hdds: [ 1024 ],
    power_on: true,
    ssh_enable: true,
    sync_enable: true,
    metadata: [ [ 'key', 'value' ] ],
    nics: [
      type: :vmxnet3,
      connected: true,
      network: "vApp netowrk",
      primary: true,
      ip_mode: "static",
      ip: "10.10.10.1",
      mac: "00:50:56:00:00:01"
    ],
    enable_guest_customization: true,
    guest_customization_script: 'touch /sample.file'
  },
  { hostname: 'ssh-vm', box: 'gosddc/precise32' },
  { hostname: 'sql-vm', box: 'gosddc/precise32' },
  { hostname: 'app-vm', box: 'gosddc/precise32' }
]

Vagrant.configure('2') do |config|

  # vCloud Director provider settings
  config.vm.provider :vcloud do |vcloud|

    vcloud.hostname = 'https://my.cloudprovider.com'
    vcloud.username = 'MyUserName'
    vcloud.password = 'MySup3rS3cr3tPassw0rd!'

    vcloud.vapp_prefix = 'multibox-sample'

    vcloud.org_name = vapp[:org_name]
    vcloud.vdc_name = vapp[:orgvdc_name]
    vcloud.catalog_name = vapp[:orgvdccatalog_name]

    vcloud.vapp_name = vapp[:name]
    vcloud.metadata_vapp = vapp[:metadata]
    vcloud.auto_yes_for_upload = vapp[:auto_yes_for_upload]

    vcloud.advanced_network = vapp[:advanced_networking]
    if vapp[:advanced_networking]
      vcloud.networks = vapp[:networks]
    else
      vcloud.ip_subnet = '172.16.32.125/255.255.255.240'
      vcloud.vdc_network_name = 'MyNetwork'
      vcloud.vdc_edge_gateway = 'MyOrgEdgeGateway'
      vcloud.vdc_edge_gateway_ip = '10.10.10.10'
      end
  end

  nodes.each do |node|
    config.vm.define node[:hostname] do |node_config|
      node_config.vm.box = node[:box]
      node_config.vm.hostname = node[:hostname]
      node_config.vm.box_url = node[:box_url]
      if vapp[:advanced_networking]
        node_config.vm.provider :vcloud do |pro|
          pro.memory = node[:memory]
          pro.cpus = node[:cpus]
          pro.add_hdds = node[:add_hdds]
          pro.nics = node[:nics]
          pro.ssh_enabled = node[:ssh_enabled]
          pro.sync_enabled = node[:sync_enabled]
          pro.power_on = node[:power_on]
          pro.metadata_vm = node[:metadata]
          pro.nested_hypervisor = node[:nested_hypervisor]
          pro.enable_guest_customization = node[:enable_guest_customization]
          pro.guest_customization_script = node[:guest_customization_script]
          if vapp[:ovf_properties]
            pro.ovf_properties = vapp[:ovf_properties]
          end
        end
        node_config.vm.network :public_network
      else
        node_config.vm.network :forwarded_port,
                               guest: 80,
                               host: 8080,
                               auto_correct: true
      end
      # node_config.vm.provision :puppet do |puppet|
      #   puppet.manifests_path = 'puppet/manifests'
      #   puppet.manifest_file = 'site.pp'
      #   puppet.module_path = 'puppet/modules'
      # end
    end
  end
end
```

For additional documentation on network setups with vCloud Director, check the [Network Deployment Options](../../wiki/Network-Deployment-Options) Wiki page

Contribute
----------

What is still missing:

-    TEST SUITES! (working on that).
-    Speed, the code is definitely not optimized.
-    Permission checks, make sure you have at least Catalog Admin privileges if you want to upload boxes to vCloud.
-    Thorough testing.
-    Error checking is absymal.
-    Some spaghetti code here and there.
-    Bugs, bugs and BUGS!.