зеркало из https://github.com/Azure/vagrant-azure.git
Puppet provisioning fixes.
This commit is contained in:
Родитель
0baec895d7
Коммит
3c2ea57eee
|
@ -0,0 +1,9 @@
|
|||
require 'rubygems'
|
||||
require 'bundler/setup'
|
||||
|
||||
$stdout.sync = true
|
||||
$stderr.sync = true
|
||||
|
||||
Dir.chdir(File.expand_path('../', __FILE__))
|
||||
|
||||
Bundler::GemHelper.install_tasks
|
|
@ -90,6 +90,14 @@ module VagrantPlugins
|
|||
end
|
||||
end
|
||||
|
||||
def self.action_read_winrm_info
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
b.use ConnectAzure
|
||||
b.use ReadSSHInfo, 5986
|
||||
end
|
||||
end
|
||||
|
||||
def self.action_read_state
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use ConfigValidate
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
# Copyright (c) Microsoft Open Technologies, Inc.
|
||||
# All Rights Reserved. Licensed under the Apache 2.0 License.
|
||||
#---------------------------------------------------------------------------
|
||||
require_relative '../provisioner/puppet'
|
||||
|
||||
module VagrantPlugins
|
||||
module WinAzure
|
||||
module Action
|
||||
|
|
|
@ -39,7 +39,7 @@ module VagrantPlugins
|
|||
|
||||
vm.tcp_endpoints.each do |endpoint|
|
||||
if endpoint[:local_port] == "#{@port}"
|
||||
return { :host => endpoint[:vip], :port => endpoint[:public_port] }
|
||||
return { :host => "#{vm.cloud_service_name}.cloudapp.net", :port => endpoint[:public_port] }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -15,12 +15,16 @@ module VagrantPlugins
|
|||
end
|
||||
|
||||
def ssh_info
|
||||
@ssh_info ||= machine.ssh_info
|
||||
@ssh_info ||= @machine.provider.winrm_info
|
||||
@ssh_info[:username] ||= @machine.config.ssh.username
|
||||
@ssh_info[:password] ||= @machine.config.ssh.password
|
||||
@ssh_info
|
||||
end
|
||||
|
||||
def remote_credentials
|
||||
@remote_credentials ||= {
|
||||
guest_ip: ssh_info[:host],
|
||||
guest_port: ssh_info[:port],
|
||||
username: ssh_info[:username],
|
||||
password: ssh_info[:password]
|
||||
}
|
||||
|
@ -49,25 +53,24 @@ module VagrantPlugins
|
|||
|
||||
def upload(from, to)
|
||||
options = {
|
||||
vm_id: vm_id,
|
||||
host_path: windows_path(from),
|
||||
guest_path: windows_path(to)
|
||||
}.merge(remote_credentials)
|
||||
|
||||
script_path = local_script_path('upload_file.ps1')
|
||||
execute(script_path, remote_credentials)
|
||||
execute(script_path, options)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def local_script_path(path)
|
||||
lib_path = Pathname.new(File.expand_path('../scripts', __FILE__))
|
||||
lib_path.join(path).to_s
|
||||
windows_path(lib_path.join(path).to_s)
|
||||
end
|
||||
|
||||
def windows_path(path)
|
||||
if path
|
||||
path = path.gsub('/', '\\')
|
||||
path = path.gsub('/', "\\")
|
||||
path = "c:#{path}" if path =~ /^\\/
|
||||
end
|
||||
path
|
||||
|
|
|
@ -48,7 +48,10 @@ module VagrantPlugins
|
|||
'locales/en.yml',
|
||||
WinAzure.source_root
|
||||
)
|
||||
|
||||
I18n.load_path << File.expand_path(
|
||||
'templates/locales/providers_hyperv.yml',
|
||||
Vagrant.source_root
|
||||
)
|
||||
I18n.reload!
|
||||
end
|
||||
|
||||
|
|
|
@ -44,6 +44,11 @@ module VagrantPlugins
|
|||
env[:machine_ssh_info]
|
||||
end
|
||||
|
||||
def winrm_info
|
||||
env = @machine.action('read_winrm_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
|
||||
|
|
|
@ -90,7 +90,7 @@ module VagrantPlugins
|
|||
manifest: config.manifest_file
|
||||
)
|
||||
@env[:ui].info 'Executing puppet script in Windows Azure VM'
|
||||
@env[:machine].provdier.driver.run_remote_ps(command) do |type, data|
|
||||
@env[:machine].provider.driver.run_remote_ps(command) do |type, data|
|
||||
# Output the data with the proper color based on the stream.
|
||||
if (type == :stdout || type == :stderr)
|
||||
@env[:ui].detail data
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
param (
|
||||
[string]$guest_ip = $(throw "-guest_ip is required."),
|
||||
[string]$guest_port = $(throw "-guest_port is required."),
|
||||
[string]$username = $(throw "-guest_username is required."),
|
||||
[string]$password = $(throw "-guest_password is required."),
|
||||
[string]$command = ""
|
||||
|
@ -16,7 +17,7 @@ $presentDir = Split-Path -parent $PSCommandPath
|
|||
. ([System.IO.Path]::Combine($presentDir, "utils\create_session.ps1"))
|
||||
|
||||
try {
|
||||
$response = Create-Remote-Session $guest_ip $username $password
|
||||
$response = Create-Remote-Session $guest_ip $guest_port $username $password
|
||||
if (!$response["session"] -and $response["error"]) {
|
||||
Write-Host $response["error"]
|
||||
return
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
#--------------------------------------------------------------------------
|
||||
|
||||
param (
|
||||
[string]$vm_id = $(throw "-vm_id is required."),
|
||||
[string]$host_path = $(throw "-host_path is required."),
|
||||
[string]$guest_path = $(throw "-guest_path is required."),
|
||||
[string]$guest_ip = $(throw "-guest_ip is required."),
|
||||
[string]$guest_port = $(throw "-guest_port is required."),
|
||||
[string]$username = $(throw "-guest_username is required."),
|
||||
[string]$password = $(throw "-guest_password is required.")
|
||||
)
|
||||
|
@ -18,29 +18,21 @@ $presentDir = Split-Path -parent $PSCommandPath
|
|||
. ([System.IO.Path]::Combine($presentDir, "utils\create_session.ps1"))
|
||||
|
||||
try {
|
||||
# Enable Guest Service Interface if they are disabled
|
||||
try {
|
||||
Get-VM -Id $vm_id | Get-VMIntegrationService -Name "Guest Service Interface" | Enable-VMIntegrationService -Passthru
|
||||
function Copy-File-To-VM($path, $content) {
|
||||
if (!(Test-Path $path)) {
|
||||
$folder = Split-Path $path
|
||||
New-Item $folder -type directory -Force
|
||||
}
|
||||
catch { }
|
||||
|
||||
function Upload-FIle-To-VM($host_path, $guest_path, $machine) {
|
||||
Write-Host $host_path
|
||||
Write-Host $guest_path
|
||||
Copy-VMFile -VM $machine -SourcePath $host_path -DestinationPath $guest_path -CreateFullPath -FileSource Host -Force -ErrorAction stop
|
||||
[IO.File]::WriteAllBytes($path, $content)
|
||||
}
|
||||
|
||||
function Prepare-Guest-Folder($guest_ip, $username, $password) {
|
||||
$response = Create-Remote-Session $guest_ip $username $password
|
||||
if (!$response["session"] -and $response["error"]) {
|
||||
$errortHash = @{
|
||||
type = "PowerShellError"
|
||||
message = $response["error"]
|
||||
}
|
||||
Write-Error-Message $errorResult
|
||||
return
|
||||
}
|
||||
$session = $response["session"]
|
||||
function Upload-FIle-To-VM($host_path, $guest_path, $session) {
|
||||
$contents = [IO.File]::ReadAllBytes($host_path)
|
||||
Invoke-Command -Session $session -ScriptBlock ${function:Copy-File-To-VM} -ArgumentList $guest_path,$contents
|
||||
}
|
||||
|
||||
function Prepare-Guest-Folder($session) {
|
||||
# Create the guest folder if not exist
|
||||
$result = Invoke-Command -Session $session -ScriptBlock ${function:Create-Guest-Folder} -ArgumentList $guest_path
|
||||
}
|
||||
|
@ -61,25 +53,34 @@ try {
|
|||
New-Item "$guest_path" -type directory -Force
|
||||
}
|
||||
|
||||
$machine = Get-VM -Id $vm_id
|
||||
$response = Create-Remote-Session $guest_ip $guest_port $username $password
|
||||
if (!$response["session"] -and $response["error"]) {
|
||||
$errortHash = @{
|
||||
type = "PowerShellError"
|
||||
message = $response["error"]
|
||||
}
|
||||
Write-Error-Message $errorResult
|
||||
return
|
||||
}
|
||||
$session = $response["session"]
|
||||
|
||||
# When Host path is a folder.
|
||||
# Find all files within it and copy to the Guest
|
||||
if (Test-Path $host_path -pathtype container) {
|
||||
# Open a remote PS Session with the guest
|
||||
Prepare-Guest-Folder $guest_ip $username $password
|
||||
Prepare-Guest-Folder $session
|
||||
# Copy all files from Host path to Guest Path
|
||||
Get-ChildItem $host_path -rec |
|
||||
Where-Object {$_.PSIsContainer -eq $false} |
|
||||
ForEach-Object -Process {
|
||||
$file_name = $_.Fullname.Replace($host_path, "")
|
||||
$folder = Split-Path $_.Fullname
|
||||
$file_name = $_.Fullname.Replace($folder, "")
|
||||
$from = $host_path + $file_name
|
||||
$to = $guest_path + $file_name
|
||||
# Write-Host $from
|
||||
# Write-Host $to
|
||||
Upload-FIle-To-VM $from $to $machine
|
||||
Upload-FIle-To-VM $from $to $session
|
||||
}
|
||||
} elseif (Test-Path $host_path) {
|
||||
Upload-FIle-To-VM $host_path $guest_path $machine
|
||||
Upload-FIle-To-VM $host_path $guest_path $session
|
||||
}
|
||||
$resultHash = @{
|
||||
message = "OK"
|
||||
|
|
|
@ -3,20 +3,20 @@
|
|||
# All Rights Reserved. Licensed under the Apache 2.0 License.
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
function Get-Remote-Session($guest_ip, $username, $password) {
|
||||
function Get-Remote-Session($guest_ip, $guest_port, $username, $password) {
|
||||
$secstr = convertto-securestring -AsPlainText -Force -String $password
|
||||
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
|
||||
New-PSSession -ComputerName $guest_ip -Credential $cred -ErrorAction "stop"
|
||||
New-PSSession -ComputerName $guest_ip -Port $guest_port -Credential $cred -UseSSL -ErrorAction "stop"
|
||||
}
|
||||
|
||||
function Create-Remote-Session($guest_ip, $username, $password) {
|
||||
function Create-Remote-Session($guest_ip, $guest_port, $username, $password) {
|
||||
$count = 0
|
||||
$session_error = ""
|
||||
$session = ""
|
||||
do {
|
||||
$count++
|
||||
try {
|
||||
$session = Get-Remote-Session $guest_ip $username $password
|
||||
$session = Get-Remote-Session $guest_ip $guest_port $username $password
|
||||
$session_error = ""
|
||||
}
|
||||
catch {
|
||||
|
|
|
@ -15,10 +15,45 @@ Gem::Specification.new do |s|
|
|||
|
||||
s.require_paths = ["lib"]
|
||||
|
||||
# The following block of code determines the files that should be included
|
||||
# in the gem. It does this by reading all the files in the directory where
|
||||
# this gemspec is, and parsing out the ignored files from the gitignore.
|
||||
# Note that the entire gitignore(5) syntax is not supported, specifically
|
||||
# the "!" syntax, but it should mostly work correctly.
|
||||
root_path = File.dirname(__FILE__)
|
||||
all_files = Dir.chdir(root_path) { Dir.glob("**/{*,.*}") }
|
||||
all_files.reject! { |file| [".", ".."].include?(File.basename(file)) }
|
||||
gitignore_path = File.join(root_path, ".gitignore")
|
||||
gitignore = File.readlines(gitignore_path)
|
||||
gitignore.map! { |line| line.chomp.strip }
|
||||
gitignore.reject! { |line| line.empty? || line =~ /^(#|!)/ }
|
||||
|
||||
unignored_files = all_files.reject do |file|
|
||||
# Ignore any directories, the gemspec only cares about files
|
||||
next true if File.directory?(file)
|
||||
|
||||
# Ignore any paths that match anything in the gitignore. We do
|
||||
# two tests here:
|
||||
#
|
||||
# - First, test to see if the entire path matches the gitignore.
|
||||
# - Second, match if the basename does, this makes it so that things
|
||||
# like '.DS_Store' will match sub-directories too (same behavior
|
||||
# as git).
|
||||
#
|
||||
gitignore.any? do |ignore|
|
||||
File.fnmatch(ignore, file, File::FNM_PATHNAME) ||
|
||||
File.fnmatch(ignore, File.basename(file), File::FNM_PATHNAME)
|
||||
end
|
||||
end
|
||||
|
||||
s.files = unignored_files
|
||||
s.executables = unignored_files.map { |f| f[/^bin\/(.*)/, 1] }.compact
|
||||
|
||||
s.add_runtime_dependency "azure", "0.6.3"
|
||||
|
||||
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", "0.6.2"
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче