зеркало из https://github.com/Azure/vagrant-azure.git
Initial import
This commit is contained in:
Родитель
e45b2ca726
Коммит
335c7ba7cd
|
@ -0,0 +1,6 @@
|
|||
id
|
||||
.DS_Store
|
||||
Gemfile.lock
|
||||
azure.box
|
||||
Vagrantfile
|
||||
!example_box/Vagrantfile
|
|
@ -0,0 +1,19 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gemspec
|
||||
|
||||
group :development do
|
||||
# We depend on Vagrant for development, but we don't add it as a
|
||||
# gem dependency because we expect to be installed within the
|
||||
# Vagrant environment itself using `vagrant plugin`.
|
||||
gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
|
||||
end
|
||||
|
||||
group :plugins do
|
||||
gem 'vagrant-azure', path: '.'
|
||||
end
|
11
README.md
11
README.md
|
@ -1,2 +1,9 @@
|
|||
vagrantazure
|
||||
============
|
||||
# Vagrant Azure Provider
|
||||
|
||||
This is a [Vagrant](http://www.vagrantup.com) 1.2+ plugin that adds [Windows Azure](https://www.windowsazure.com)
|
||||
provider to Vagrant, allowing Vagrant to control and provision machines in
|
||||
Windows Azure.
|
||||
|
||||
**NOTE:** This plugin requires Vagrant 1.2+,
|
||||
|
||||
## Configuration
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
Vagrant.require_plugin "vagrant-azure"
|
||||
|
||||
Vagrant.configure('2') do |config|
|
||||
config.vm.provider :azure do |azure|
|
||||
azure.vm_name = 'cloudinittest'
|
||||
azure.cloud_service_name = 'cloudinittest'
|
||||
end
|
||||
end
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"provider": "azure"
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'pathname'
|
||||
|
||||
require 'vagrant-azure/plugin'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
lib_path = Pathname.new(File.expand_path('../vagrant-azure', __FILE__))
|
||||
autoload :Action, lib_path.join('action')
|
||||
autoload :Error, lib_path.join('errors')
|
||||
|
||||
# This returns the path to the source of this plugin.
|
||||
#
|
||||
# @return [Pathname]
|
||||
def self.source_root
|
||||
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,189 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'pathname'
|
||||
|
||||
require 'vagrant/action/builder'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
# Include the built-in modules so we can use them as top-level things.
|
||||
include Vagrant::Action::Builtin
|
||||
|
||||
# This action is called to halt the remote machine.
|
||||
def self.action_halt
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use Call, IsCreated do |env, b2|
|
||||
if !env[:result]
|
||||
b2.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
|
||||
b2.use ConnectAzure
|
||||
b2.use StopInstance
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# This action is called to terminate the remote machine.
|
||||
def self.action_destroy
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use Call, DestroyConfirm do |env, b2|
|
||||
if env[:result]
|
||||
b2.use ConfigValidate
|
||||
b.use Call, IsCreated do |env2, b3|
|
||||
if !env2[:result]
|
||||
b3.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
end
|
||||
|
||||
b2.use ConnectAzure
|
||||
b2.use TerminateInstance
|
||||
b2.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
||||
else
|
||||
b2.use MessageWillNotDestroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# This action is called when `vagrant provision` is called.
|
||||
def self.action_provision
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use Call, IsCreated do |env, b2|
|
||||
if !env[:result]
|
||||
b2.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
|
||||
b2.use Provision
|
||||
b2.use SyncFolders
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# This action is called to read the SSH info of the machine. The
|
||||
# resulting state is expected to be put into the `:machine_ssh_info` key.
|
||||
def self.action_read_ssh_info
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use ConnectAzure
|
||||
b.use ReadSSHInfo
|
||||
end
|
||||
end
|
||||
|
||||
def self.action_read_state
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use ConnectAzure
|
||||
b.use ReadState
|
||||
end
|
||||
end
|
||||
|
||||
# This action is called to SSH into the machine
|
||||
def self.action_ssh
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use Call, IsCreated do |env, b2|
|
||||
if !env[:result]
|
||||
b2.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
|
||||
b2.use SSHExec
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.action_ssh_run
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use Call, IsCreated do |env, b2|
|
||||
if !env[:result]
|
||||
b2.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
|
||||
b2.use SSHRun
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.action_prepare_boot
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use Provision
|
||||
b.use SyncFolders
|
||||
b.use WarnNetworks
|
||||
end
|
||||
end
|
||||
|
||||
# This action is called to bring the box up from nothing
|
||||
def self.action_up
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use HandleBoxUrl
|
||||
b.use ConfigValidate
|
||||
b.use ConnectAzure
|
||||
b.use Call, IsCreated do |env1, b1|
|
||||
if env1[:result]
|
||||
b1.use Call, IsStopped do |env2, b2|
|
||||
if env2[:result]
|
||||
# b2.use action_prepare_boot
|
||||
b2.use StartInstance # restart this instance
|
||||
else
|
||||
b2.use MessageAlreadyCreated
|
||||
end
|
||||
end
|
||||
else
|
||||
# b1.use action_prepare_boot
|
||||
b1.use RunInstance # Launch a new instance
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.action_reload
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use ConnectAzure
|
||||
b.use Call, IsCreated do |env, b2|
|
||||
if !env[:result]
|
||||
b2.use MessageNotCreated
|
||||
next
|
||||
end
|
||||
|
||||
b2.use action_halt
|
||||
b2.use Call, WaitForState, :StoppedDeallocated, 120 do |env2, b3|
|
||||
if env2[:result]
|
||||
b3.use action_up
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# The autoload farm
|
||||
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
||||
autoload :ConnectAzure, action_root.join('connect_azure')
|
||||
autoload :IsCreated, action_root.join('is_created')
|
||||
autoload :IsStopped, action_root.join('is_stopped')
|
||||
autoload :MessageAlreadyCreated, action_root.join('message_already_created')
|
||||
autoload :MessageNotCreated, action_root.join('message_not_created')
|
||||
autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
|
||||
# autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
||||
autoload :ReadState, action_root.join('read_state')
|
||||
autoload :RunInstance, action_root.join('run_instance')
|
||||
autoload :StartInstance, action_root.join('start_instance')
|
||||
autoload :StopInstance, action_root.join('stop_instance')
|
||||
# autoload :SyncFolders, action_root.join('sync_folders')
|
||||
autoload :TerminateInstance, action_root.join('terminate_instance')
|
||||
# autoload :TimedProvision, action_root.join('timed_provision')
|
||||
autoload :WaitForState, action_root.join('wait_for_state')
|
||||
# autoload :WarnNetworks, action_root.join('warn_networks')
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,41 @@
|
|||
#---------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'azure'
|
||||
require 'log4r'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class ConnectAzure
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure::action::connect_aws')
|
||||
end
|
||||
|
||||
def call (env)
|
||||
config = env[:machine].provider_config
|
||||
|
||||
env[:ui].warn "Subscription ID: [#{config.subscription_id}]"
|
||||
env[:ui].warn "Mangement Certificate: [#{config.mgmt_certificate}]"
|
||||
env[:ui].warn "Mangement Endpoint: [#{config.mgmt_endpoint}]"
|
||||
env[:ui].warn "Storage Account Name: [#{config.storage_acct_name}]"
|
||||
env[:ui].warn "Storage Access Key: [#{config.storage_access_key}]"
|
||||
|
||||
Azure.configure do |c|
|
||||
c.subscription_id = config.subscription_id
|
||||
c.management_certificate = config.mgmt_certificate
|
||||
c.management_endpoint = config.mgmt_endpoint
|
||||
c.storage_account_name = config.storage_acct_name
|
||||
c.storage_access_key = config.storage_access_key
|
||||
end
|
||||
|
||||
env[:azure_vm_service] = Azure::VirtualMachineManagementService.new
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,24 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
# This is a dummy implementation.
|
||||
# TODO call Azure APIs to get the state
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class IsCreated
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:result] = env[:machine].state.id != :NotCreated
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,24 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
# This is a dummy implementation.
|
||||
# TODO call Azure APIs to get the state
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class IsStopped
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:result] = env[:machine].state.id == :StoppedDeallocated
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,21 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class MessageAlreadyCreated
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:ui].info(
|
||||
I18n.t('vagrant_azure.already_status', :status => 'created')
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,20 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class MessageNotCreated
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def env(env)
|
||||
env[:ui].info(I18n.t('vagrant_azure.not_created'))
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,21 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class MessageWillNotDestroy
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:machine].id =~ /@/
|
||||
env[:ui].info(I18n.t('vagrant_azure.will_not_destroy', :name => $`))
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,44 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class ReadState
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure::action::read_state')
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:machine_state_id] = read_state(env)
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
|
||||
def read_state(env)
|
||||
return :NotCreated if env[:machine].id.nil?
|
||||
|
||||
env[:machine].id =~ /@/
|
||||
|
||||
env[:ui].info "Attempting to read state for #{$`} in #{$'}"
|
||||
|
||||
vm = env[:azure_vm_service].get_virtual_machine($`, $')
|
||||
|
||||
env[:ui].info "VM Status: #{vm.status.to_sym}"
|
||||
|
||||
if vm.nil?
|
||||
@logger.info 'Machine cannot be found'
|
||||
env[:machine].id = nil
|
||||
return :NotCreated
|
||||
end
|
||||
|
||||
return vm.status.to_sym
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,65 @@
|
|||
#---------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
require 'json'
|
||||
require 'azure'
|
||||
|
||||
require 'vagrant/util/retryable'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class RunInstance
|
||||
include Vagrant::Util::Retryable
|
||||
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure::action::run_instance')
|
||||
end
|
||||
|
||||
def call(env)
|
||||
config = env[:machine].provider_config
|
||||
|
||||
params = {
|
||||
vm_name: config.vm_name,
|
||||
vm_user: config.vm_user,
|
||||
password: config.vm_password,
|
||||
image: config.vm_image,
|
||||
location: config.vm_location,
|
||||
affinity_group: config.vm_affinity_group
|
||||
}
|
||||
|
||||
options = {
|
||||
storage_account_name: config.storage_acct_name,
|
||||
cloud_service_name: config.cloud_service_name,
|
||||
deployment_name: config.deployment_name,
|
||||
tcp_endpoints: config.tcp_endpoints,
|
||||
private_key_file: config.ssh_private_key_file,
|
||||
certificate_file: config.ssh_certificate_file,
|
||||
ssh_port: config.ssh_port,
|
||||
vm_size: config.vm_size,
|
||||
winrm_transport: config.winrm_transport,
|
||||
availability_set_name: config.availability_set_name
|
||||
}
|
||||
|
||||
add_role = config.add_role
|
||||
|
||||
env[:ui].info(params.inspect)
|
||||
env[:ui].info(options.inspect)
|
||||
env[:ui].info("Add Role? - #{add_role}")
|
||||
|
||||
server = env[:azure_vm_service].create_virtual_machine(
|
||||
params, options, add_role
|
||||
)
|
||||
|
||||
# TODO: Exception/Error Handling
|
||||
env[:machine].id = "#{server.vm_name}@#{server.cloud_service_name}"
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,35 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
|
||||
# require 'vagrant/util/retryable'
|
||||
|
||||
# Barebones basic implemenation. This a work in progress in very early stages
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
# This starts a stopped instance
|
||||
class StartInstance
|
||||
# include Vagrant:Util::Retryable
|
||||
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure:action::start_instance')
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:machine].id = "#{env[:machine].provider_config.vm_name}@#{env[:machine].provider_config.cloud_service_name}" unless env[:machine].id
|
||||
env[:machine].id =~ /@/
|
||||
|
||||
env[:ui].info "Attempting to start '#{$`}' in '#{$'}'"
|
||||
|
||||
env[:azure_vm_service].start_virtual_machine($`, $')
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,38 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
|
||||
# Barebones basic implemenation. This a work in progress in very early stages
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class StopInstance
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure::action::stop_instance')
|
||||
end
|
||||
|
||||
def call(env)
|
||||
if env[:machine].state.id == :StoppedDeallocated
|
||||
env[:ui].info(
|
||||
I18n.t('vagrant_azure.already_status', :status => 'stopped.')
|
||||
)
|
||||
else
|
||||
env[:machine].id =~ /@/
|
||||
env[:ui].info(
|
||||
I18n.t(
|
||||
'vagrant_azure.stopping',
|
||||
:vm_name => $`,
|
||||
:cloud_service_name => $'
|
||||
)
|
||||
)
|
||||
env[:azure_vm_service].shutdown_virtual_machine($`, $')
|
||||
end
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,34 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class TerminateInstance
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
@logger = Log4r::Logger.new('vagrant_azure::action::terminate_instance')
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:machine].id =~ /@/
|
||||
|
||||
vm = env[:azure_vm_service].get_virtual_machine($`, $')
|
||||
|
||||
if vm.nil?
|
||||
# machine not found. assuming it was not created or destroyed
|
||||
env[:ui].info (I18n.t('vagrant_azure.not_created'))
|
||||
else
|
||||
env[:azure_vm_service].delete_virtual_machine($`, $')
|
||||
env[:machine].id = nil
|
||||
end
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,45 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
require 'timeout'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
class WaitForState
|
||||
def initialize(app, state, timeout)
|
||||
@app = app
|
||||
@state = state
|
||||
@timeout = timeout
|
||||
@logger = Log4r::Logger.new("vagrant_azure::action::wait_for_state")
|
||||
end
|
||||
|
||||
def call(env)
|
||||
env[:result] = true
|
||||
|
||||
if env[:machine].state.id == @state
|
||||
@logger.info(
|
||||
I18n.t('vagrant_azure.already_status', :status => @state)
|
||||
)
|
||||
else
|
||||
@logger.info("Waiting for machine to reache state #{@state}")
|
||||
|
||||
begin
|
||||
Timeout.timeout(@timeout) do
|
||||
until env[:machine].state.id == @state
|
||||
sleep 5
|
||||
end
|
||||
end
|
||||
rescue Timeout::Error
|
||||
env[:result] = false # couldn't reach state in time
|
||||
end
|
||||
end
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,131 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'vagrant'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
class Config < Vagrant.plugin('2', :config)
|
||||
attr_accessor :storage_acct_name
|
||||
attr_accessor :storage_access_key
|
||||
attr_accessor :mgmt_certificate
|
||||
attr_accessor :mgmt_endpoint
|
||||
attr_accessor :subscription_id
|
||||
|
||||
attr_accessor :vm_name
|
||||
attr_accessor :vm_user
|
||||
attr_accessor :vm_password
|
||||
attr_accessor :vm_image
|
||||
attr_accessor :vm_location
|
||||
attr_accessor :vm_affinity_group
|
||||
|
||||
attr_accessor :cloud_service_name
|
||||
attr_accessor :deployment_name
|
||||
attr_accessor :tcp_endpoints
|
||||
attr_accessor :ssh_private_key_file
|
||||
attr_accessor :ssh_certificate_file
|
||||
attr_accessor :ssh_port
|
||||
attr_accessor :vm_size
|
||||
attr_accessor :winrm_transport
|
||||
attr_accessor :availability_set_name
|
||||
attr_accessor :add_role
|
||||
|
||||
def initialize
|
||||
@storage_acct_name = UNSET_VALUE
|
||||
@storage_access_key = UNSET_VALUE
|
||||
@mgmt_certificate = UNSET_VALUE
|
||||
@mgmt_endpoint = UNSET_VALUE
|
||||
@subscription_id = UNSET_VALUE
|
||||
|
||||
@vm_name = UNSET_VALUE
|
||||
@vm_user = UNSET_VALUE
|
||||
@vm_password = UNSET_VALUE
|
||||
@vm_image = UNSET_VALUE
|
||||
@vm_location = UNSET_VALUE
|
||||
@vm_affinity_group = UNSET_VALUE
|
||||
|
||||
@cloud_service_name = UNSET_VALUE
|
||||
@deployment_name = UNSET_VALUE
|
||||
@tcp_endpoints = UNSET_VALUE
|
||||
@ssh_private_key_file = UNSET_VALUE
|
||||
@ssh_certificate_file = UNSET_VALUE
|
||||
@ssh_port = UNSET_VALUE
|
||||
@vm_size = UNSET_VALUE
|
||||
@winrm_transport = UNSET_VALUE
|
||||
@availability_set_name = UNSET_VALUE
|
||||
@add_role = UNSET_VALUE
|
||||
end
|
||||
|
||||
def finalize!
|
||||
@storage_acct_name = ENV["AZURE_STORAGE_ACCOUNT"] if \
|
||||
@storage_acct_name == UNSET_VALUE
|
||||
@storage_access_key = ENV["AZURE_STORAGE_ACCESS_KEY"] if \
|
||||
@storage_access_key == UNSET_VALUE
|
||||
@mgmt_certificate = ENV["AZURE_MANAGEMENT_CERTIFICATE"] if \
|
||||
@mgmt_certificate == UNSET_VALUE
|
||||
@mgmt_endpoint = ENV["AZURE_MANAGEMENT_ENDPOINT"] if \
|
||||
@mgmt_endpoint == UNSET_VALUE
|
||||
@subscription_id = ENV["AZURE_SUBSCRIPTION_ID"] if \
|
||||
@subscription_id == UNSET_VALUE
|
||||
|
||||
@vm_name = nil if @vm_name == UNSET_VALUE
|
||||
@vm_user = 'vagrantone' if @vm_user == UNSET_VALUE
|
||||
@vm_password = nil if @vm_password == UNSET_VALUE
|
||||
@vm_image = nil if @vm_image == UNSET_VALUE
|
||||
@vm_location = nil if @vm_location == UNSET_VALUE
|
||||
@vm_affinity_group = nil if @vm_affinity_group == UNSET_VALUE
|
||||
|
||||
@cloud_service_name = nil if @cloud_service_name == UNSET_VALUE
|
||||
@deployment_name = nil if @deployment_name == UNSET_VALUE
|
||||
@tcp_endpoints = nil if @tcp_endpoints == UNSET_VALUE
|
||||
@ssh_private_key_file = nil if @ssh_private_key_file == UNSET_VALUE
|
||||
@ssh_certificate_file = nil if @ssh_certificate_file == UNSET_VALUE
|
||||
@ssh_port = nil if @ssh_port == UNSET_VALUE
|
||||
@vm_size = nil if @vm_size == UNSET_VALUE
|
||||
@winrm_transport = nil if @winrm_transport == UNSET_VALUE
|
||||
@availability_set_name = nil if @availability_set_name == UNSET_VALUE
|
||||
|
||||
@add_role = false if @add_role == UNSET_VALUE
|
||||
end
|
||||
|
||||
def merge(other)
|
||||
super.tap do |result|
|
||||
result.storage_account_name = other.storage_acct_name || \
|
||||
self.storage_acct_name
|
||||
result.storage_access_key = other.storage_access_key || \
|
||||
self.storage_access_key
|
||||
result.mgmt_certificate = other.mgmt_certificate || \
|
||||
self.mgmt_certificate
|
||||
result.mgmt_endpoint = other.mgmt_endpoint || \
|
||||
self.mgmt_endpoint
|
||||
result.subscription_id = other.subscription_id || \
|
||||
self.subscription_id
|
||||
end
|
||||
end
|
||||
|
||||
def validate(machine)
|
||||
errors = _detected_errors
|
||||
|
||||
# Azure connection properties related validation.
|
||||
errors << "vagrant_azure.subscription_id.requried" if \
|
||||
@subscription_id.nil?
|
||||
errors << "vagrant_azure.mgmt_certificate.requried" if \
|
||||
@mgmt_certificate.nil?
|
||||
errors << "vagrant_azaure.mgmt_endpoint.requried" if \
|
||||
@mgmt_endpoint.nil?
|
||||
errors << "vagrant_azure.storage_acct_name.requried" if\
|
||||
@storage_acct_name.nil?
|
||||
errors << "vagrant_azure.storage_access_key.requried" if\
|
||||
@storage_access_key.nil?
|
||||
|
||||
# Azure Virtual Machine related validation
|
||||
errors << "vagrant_azure.vm_name.required" if @vm_name.nil?
|
||||
errors << "vagrant_azure.cloud_serivce_name.required" if \
|
||||
@cloud_service_name.nil?
|
||||
|
||||
{ "Windows Azure Provider" => errors }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,79 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
begin
|
||||
require 'vagrant'
|
||||
rescue LoadError
|
||||
raise 'The Vagrant Azure plugin must be run within Vagrant.'
|
||||
end
|
||||
|
||||
# This is a sanity check to make sure no one is attempting to install this into
|
||||
# an early Vagrant version.
|
||||
if Vagrant::VERSION < '1.2.0'
|
||||
raise 'The Vagrant Azure plugin is only compatible with Vagrant 1.2+'
|
||||
end
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
class Plugin < Vagrant.plugin('2')
|
||||
name 'azure'
|
||||
description <<-DESC
|
||||
This plugin installs a provider that allows Vagrant to manage
|
||||
machines in Windows Azure.
|
||||
DESC
|
||||
|
||||
config(:azure, :provider) do
|
||||
require_relative 'config'
|
||||
Config
|
||||
end
|
||||
|
||||
provider(:azure, parallel: true) do
|
||||
# Setup logging and i18n
|
||||
setup_logging
|
||||
setup_i18n
|
||||
|
||||
# Return the provider
|
||||
require_relative 'provider'
|
||||
Provider
|
||||
end
|
||||
|
||||
def self.setup_i18n
|
||||
I18n.load_path << File.expand_path(
|
||||
'locales/en.yml',
|
||||
WinAzure.source_root
|
||||
)
|
||||
|
||||
I18n.reload!
|
||||
end
|
||||
|
||||
def self.setup_logging
|
||||
require 'log4r'
|
||||
|
||||
level = nil
|
||||
begin
|
||||
level = Log4r.const_get(ENV['VAGRANT_LOG'].upcase)
|
||||
rescue NameError
|
||||
# This means that the logging constant wasn't found,
|
||||
# which is fine. We just keep `level` as `nil`. But
|
||||
# we tell the user.
|
||||
level = nil
|
||||
end
|
||||
|
||||
# Some constants, such as "true" resolve to booleans, so the
|
||||
# above error checking doesn't catch it. This will check to make
|
||||
# sure that the log level is an integer, as Log4r requires.
|
||||
level = nil if !level.is_a?(Integer)
|
||||
|
||||
# Set the logging level on all "vagrant" namespaced logs as long as
|
||||
# we have a valid level
|
||||
if level
|
||||
logger = Log4r::Logger.new("vagrant_azure")
|
||||
logger.outputters = Log4r::Outputter.stderr
|
||||
logger.level = level
|
||||
logger = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,51 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
require 'log4r'
|
||||
require 'vagrant'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
class Provider < Vagrant.plugin('2', :provider)
|
||||
def initialize(machine)
|
||||
@machine = machine
|
||||
end
|
||||
|
||||
def action(name)
|
||||
# Attempt to get the action method from the Action class if it
|
||||
# exists, otherwise return nil to show that we don't support the
|
||||
# given action.
|
||||
action_method = "action_#{name}"
|
||||
return Action.send(action_method) if Action.respond_to?(action_method)
|
||||
nil
|
||||
end
|
||||
|
||||
def ssh_info
|
||||
# Run a custom action called "read_ssh_info" which does what it
|
||||
# says and puts the resulting SSH info into the `:machine_ssh_info`
|
||||
# key in the environment.
|
||||
env = @machine.action('read_ssh_info')
|
||||
env[:machine_ssh_info]
|
||||
end
|
||||
|
||||
def state
|
||||
# Run a custom action we define called "read_state" which does what it
|
||||
# says. It puts the state in the `:machine_state_id` key in the env
|
||||
env = @machine.action('read_state')
|
||||
state_id = env[:machine_state_id]
|
||||
|
||||
short = "Machine's current state is #{state_id}"
|
||||
long = ""
|
||||
|
||||
# Return the MachineState object
|
||||
Vagrant::MachineState.new(state_id, short, long)
|
||||
end
|
||||
|
||||
def to_s
|
||||
id = @machine.id.nil? ? 'new' : @machine.id
|
||||
"Azure (#{id})"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,10 @@
|
|||
#--------------------------------------------------------------------------
|
||||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the MIT License.
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
VERSION = '0.0.1.dev'
|
||||
end
|
||||
end
|
|
@ -0,0 +1,10 @@
|
|||
en:
|
||||
vagrant_azure:
|
||||
not_created: |-
|
||||
The machine does not exist. Please run `vagrant up` first.
|
||||
will_not_destroy: |-
|
||||
The machine '%{name}' will not be destroyed as the user declined confirmation.
|
||||
already_status: |-
|
||||
The machine is already %{status}.
|
||||
stopping: |-
|
||||
Stopping %{vm_name} in %{cloud_service_name}
|
|
@ -0,0 +1,24 @@
|
|||
# coding: utf-8
|
||||
lib = File.expand_path('../lib', __FILE__)
|
||||
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||
require 'vagrant-azure/version'
|
||||
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "vagrant-azure"
|
||||
s.version = VagrantPlugins::WinAzure::VERSION
|
||||
s.authors = ["DeeJay"]
|
||||
s.email = ["dheeraj@nagwani.in"]
|
||||
s.description = "Enable Vagrant to manage machines in Azure"
|
||||
s.summary = "Enable Vagrant to manage machines in Azure"
|
||||
s.homepage = ""
|
||||
s.license = "MIT"
|
||||
|
||||
s.require_paths = ["lib"]
|
||||
|
||||
s.add_development_dependency "bundler", "~> 1.3"
|
||||
s.add_development_dependency "rake"
|
||||
s.add_development_dependency "minitest"
|
||||
s.add_development_dependency "minitest-reporters"
|
||||
s.add_development_dependency "mocha"
|
||||
s.add_development_dependency "azure"
|
||||
end
|
Загрузка…
Ссылка в новой задаче