vagrant-oci 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/Gemfile +12 -0
- data/README.md +20 -0
- data/Rakefile +2 -0
- data/Vagrantfile.sample/Vagrantfile +50 -0
- data/Vagrantfile.sample/site.yml +11 -0
- data/example_box/README.md +13 -0
- data/example_box/Vagrantfile +7 -0
- data/example_box/metadata.json +3 -0
- data/lib/vagrant-oci.rb +18 -0
- data/lib/vagrant-oci/action.rb +160 -0
- data/lib/vagrant-oci/action/connect_oci.rb +60 -0
- data/lib/vagrant-oci/action/is_created.rb +16 -0
- data/lib/vagrant-oci/action/is_stopped.rb +19 -0
- data/lib/vagrant-oci/action/is_terminated.rb +18 -0
- data/lib/vagrant-oci/action/message_already_created.rb +16 -0
- data/lib/vagrant-oci/action/message_not_created.rb +16 -0
- data/lib/vagrant-oci/action/read_ssh_info.rb +45 -0
- data/lib/vagrant-oci/action/read_state.rb +44 -0
- data/lib/vagrant-oci/action/run_instance.rb +116 -0
- data/lib/vagrant-oci/action/start_instance.rb +34 -0
- data/lib/vagrant-oci/action/stop_instance.rb +34 -0
- data/lib/vagrant-oci/action/terminate_instance.rb +25 -0
- data/lib/vagrant-oci/action/warn_networks.rb +20 -0
- data/lib/vagrant-oci/action/warn_ssh_keys.rb +20 -0
- data/lib/vagrant-oci/config.rb +29 -0
- data/lib/vagrant-oci/plugin.rb +69 -0
- data/lib/vagrant-oci/provider.rb +45 -0
- data/lib/vagrant-oci/version.rb +5 -0
- data/locales/en.yml +70 -0
- data/vagrant-oci.gemspec +29 -0
- metadata +115 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 72d739d292b54d5033ecf2c7d35e17f23d488049eccb24f5ea9fb0866253a270
|
4
|
+
data.tar.gz: 2e45ec6e8e308db1c175a4c06aee21c4617e40edfb432657c780d20f770d2ff2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2f80ef326a3f181483cc2b75fc7ce50a518c19012ad1136d9bddfcba632b957e6764f8974cf5b4d4e21dcd12a3a4b24c386964ac326d1a0809d18a577748f06f
|
7
|
+
data.tar.gz: 2a1e97b3b3066dc9a337dc573e2c1107facb634f49c53a317ebebe653ee3a81aad0120d24f9de9fe9a3d9053204a8ebcac58b557ecadce8f41bb905df381ac46
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Vagrant OCI Plugin
|
2
|
+
|
3
|
+
A Vagrant plugin for Oracle Cloud Infrastructure (OCI)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Build the gem:
|
8
|
+
|
9
|
+
```bash
|
10
|
+
rake build
|
11
|
+
```
|
12
|
+
|
13
|
+
Install it into Vagrant:
|
14
|
+
```bash
|
15
|
+
vagrant plugin install ./pkg/vagrant-oci-<version>.gem
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
See the example [Vagrantfile](Vagrantfile.sample/Vagrantfile)
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure("2") do |config|
|
5
|
+
# Dummy box for oci provider, not the image ocid.
|
6
|
+
# Leave alone unless you know what you're doing.
|
7
|
+
config.vm.box = "stephenpearson/oci"
|
8
|
+
|
9
|
+
# For remote cloud instances, use rsync synced folders.
|
10
|
+
config.vm.synced_folder ".", "/vagrant", type: 'rsync'
|
11
|
+
|
12
|
+
# Define default provider options
|
13
|
+
config.vm.provider :oci do |oci, override|
|
14
|
+
oci.config_file = '~/.oci/config'
|
15
|
+
oci.profile = 'DEFAULT'
|
16
|
+
oci.region = 'us-phoenix-1'
|
17
|
+
override.ssh.username = 'opc'
|
18
|
+
override.ssh.private_key_path = '~/.ssh/id_rsa'
|
19
|
+
# override.ssh.port = 22
|
20
|
+
# oci.defined_tags = {
|
21
|
+
# MyTagNameSpace: {
|
22
|
+
# foo: "bar"
|
23
|
+
# }
|
24
|
+
# }
|
25
|
+
end
|
26
|
+
|
27
|
+
config.vm.define :srv1 do |srv1|
|
28
|
+
srv1.vm.provision :ansible do |ansible|
|
29
|
+
ansible.playbook = "site.yml"
|
30
|
+
end
|
31
|
+
srv1.vm.provider :oci do |oci, override|
|
32
|
+
# oci.freeform_tags = {
|
33
|
+
# vagrant: "true"
|
34
|
+
# }
|
35
|
+
oci.shape = 'VM.Standard2.1'
|
36
|
+
oci.image_compartment_name = 'Images'
|
37
|
+
oci.image_regex = '^Oracle-Linux-7.6-20'
|
38
|
+
oci.server_compartment_name = 'Infrastructure'
|
39
|
+
# Ensure the AD matches the subnet's AD (except for regional subnets).
|
40
|
+
oci.ad = 1
|
41
|
+
|
42
|
+
oci.subnet_vcn_compartment_name = 'Networks'
|
43
|
+
oci.subnet_vcn_dns_label = 'phx1'
|
44
|
+
oci.subnet_compartment_name = 'Networks'
|
45
|
+
oci.subnet_dns_label = 'wh1n1'
|
46
|
+
|
47
|
+
# oci.use_private_network = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Vagrant OCI Example Box
|
2
|
+
|
3
|
+
Vagrant providers each require a custom provider-specific box format.
|
4
|
+
This folder shows the example contents of a box for the `oci` provider.
|
5
|
+
To turn this into a box:
|
6
|
+
|
7
|
+
```
|
8
|
+
$ tar cvzf oci.box ./metadata.json ./Vagrantfile
|
9
|
+
```
|
10
|
+
|
11
|
+
This box works by using Vagrant's built-in Vagrantfile merging to setup
|
12
|
+
defaults for OCI. These defaults can easily be overwritten by higher-level
|
13
|
+
Vagrantfiles (such as project root Vagrantfiles).
|
data/lib/vagrant-oci.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "pathname"
|
2
|
+
|
3
|
+
require "vagrant-oci/plugin"
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OCI
|
7
|
+
lib_path = Pathname.new(File.expand_path("../vagrant-oci", __FILE__))
|
8
|
+
autoload :Action, lib_path.join("action")
|
9
|
+
autoload :Errors, lib_path.join("errors")
|
10
|
+
|
11
|
+
# This returns the path to the source of this plugin.
|
12
|
+
#
|
13
|
+
# @return [Pathname]
|
14
|
+
def self.source_root
|
15
|
+
@source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require "vagrant/action/builder"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action # rubocop:disable Metrics/ModuleLength
|
6
|
+
# Include the built-in modules so we can use them as top-level things.
|
7
|
+
include Vagrant::Action::Builtin
|
8
|
+
|
9
|
+
def self.action_read_state
|
10
|
+
Vagrant::Action::Builder.new.tap do |b|
|
11
|
+
b.use ConfigValidate
|
12
|
+
b.use ConnectOCI
|
13
|
+
b.use ReadState
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.action_read_ssh_info
|
18
|
+
Vagrant::Action::Builder.new.tap do |b|
|
19
|
+
b.use ConfigValidate
|
20
|
+
b.use ConnectOCI
|
21
|
+
b.use ReadSSHInfo
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# This action is called to SSH into the machine.
|
26
|
+
def self.action_ssh
|
27
|
+
Vagrant::Action::Builder.new.tap do |b|
|
28
|
+
b.use ConfigValidate
|
29
|
+
b.use Call, IsCreated do |env, b2|
|
30
|
+
unless env[:result]
|
31
|
+
b2.use MessageNotCreated
|
32
|
+
next
|
33
|
+
end
|
34
|
+
|
35
|
+
b2.use SSHExec
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.action_ssh_run
|
41
|
+
Vagrant::Action::Builder.new.tap do |b|
|
42
|
+
b.use ConfigValidate
|
43
|
+
b.use Call, IsCreated do |env, b2|
|
44
|
+
unless env[:result]
|
45
|
+
b2.use MessageNotCreated
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
49
|
+
b2.use SSHRun
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.action_up
|
55
|
+
Vagrant::Action::Builder.new.tap do |b|
|
56
|
+
b.use HandleBox
|
57
|
+
b.use ConfigValidate
|
58
|
+
b.use BoxCheckOutdated
|
59
|
+
b.use ConnectOCI
|
60
|
+
b.use Call, IsCreated do |env1, b1|
|
61
|
+
if env1[:result]
|
62
|
+
b1.use Call, IsTerminated do |env2, b2|
|
63
|
+
if env2[:result]
|
64
|
+
b2.use Provision
|
65
|
+
b2.use SyncedFolders
|
66
|
+
b2.use WarnNetworks
|
67
|
+
b2.use WarnSshKeys
|
68
|
+
b2.use RunInstance
|
69
|
+
else
|
70
|
+
b2.use Call, IsStopped do |env3, b3|
|
71
|
+
if env3[:result]
|
72
|
+
b3.use StartInstance
|
73
|
+
else
|
74
|
+
b2.use MessageAlreadyCreated # TODO write a better message
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
else
|
80
|
+
b1.use Provision
|
81
|
+
b1.use SyncedFolders
|
82
|
+
b1.use WarnNetworks
|
83
|
+
b1.use WarnSshKeys
|
84
|
+
b1.use RunInstance
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.action_provision
|
91
|
+
Vagrant::Action::Builder.new.tap do |b|
|
92
|
+
b.use ConfigValidate
|
93
|
+
b.use Call, IsCreated do |env, b2|
|
94
|
+
unless env[:result]
|
95
|
+
b2.use MessageNotCreated
|
96
|
+
next
|
97
|
+
end
|
98
|
+
|
99
|
+
b2.use Provision
|
100
|
+
b2.use SyncedFolders
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.action_halt
|
106
|
+
Vagrant::Action::Builder.new.tap do |b|
|
107
|
+
b.use ConfigValidate
|
108
|
+
b.use Call, IsCreated do |env, b2|
|
109
|
+
if !env[:result]
|
110
|
+
b2.use MessageNotCreated
|
111
|
+
next
|
112
|
+
end
|
113
|
+
|
114
|
+
b2.use ConnectOCI
|
115
|
+
b2.use StopInstance
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.action_destroy
|
121
|
+
Vagrant::Action::Builder.new.tap do |b|
|
122
|
+
b.use Call, DestroyConfirm do |env, b2|
|
123
|
+
if env[:result]
|
124
|
+
b2.use ConfigValidate
|
125
|
+
b2.use Call, IsCreated do |env2, b3|
|
126
|
+
unless env2[:result]
|
127
|
+
b3.use MessageNotCreated
|
128
|
+
next
|
129
|
+
end
|
130
|
+
b3.use ConnectOCI
|
131
|
+
b3.use TerminateInstance
|
132
|
+
end
|
133
|
+
else
|
134
|
+
b2.use MessageWillNotDestroy
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
141
|
+
|
142
|
+
autoload :ConnectOCI, action_root.join("connect_oci")
|
143
|
+
autoload :IsCreated, action_root.join("is_created")
|
144
|
+
autoload :IsTerminated, action_root.join("is_terminated")
|
145
|
+
autoload :IsStopped, action_root.join("is_stopped")
|
146
|
+
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
|
147
|
+
autoload :MessageNotCreated, action_root.join("message_not_created")
|
148
|
+
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
149
|
+
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
|
150
|
+
autoload :ReadState, action_root.join("read_state")
|
151
|
+
autoload :RunInstance, action_root.join("run_instance")
|
152
|
+
autoload :StartInstance, action_root.join("start_instance")
|
153
|
+
autoload :StopInstance, action_root.join("stop_instance")
|
154
|
+
autoload :TerminateInstance, action_root.join("terminate_instance")
|
155
|
+
autoload :WarnNetworks, action_root.join("warn_networks")
|
156
|
+
autoload :WarnNetworks, action_root.join("warn_networks")
|
157
|
+
autoload :WarnSshKeys, action_root.join("warn_ssh_keys")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'oci'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OCI
|
6
|
+
module Action
|
7
|
+
class ConnectOCI
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::connect_oci")
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
provider_config = env[:machine].provider_config
|
15
|
+
|
16
|
+
region = provider_config.region
|
17
|
+
config_file = provider_config.config_file || ::OCI::ConfigFileLoader::DEFAULT_CONFIG_FILE
|
18
|
+
profile_name = provider_config.profile || ::OCI::ConfigFileLoader::DEFAULT_PROFILE
|
19
|
+
|
20
|
+
oci_config = ::OCI::ConfigFileLoader.load_config(config_file_location: config_file,
|
21
|
+
profile_name: profile_name)
|
22
|
+
env[:oci_config] = oci_config
|
23
|
+
|
24
|
+
@logger.info("Creating OCI API compute client and adding to Vagrant environment")
|
25
|
+
env[:oci_compute] = ::OCI::Core::ComputeClient.new(config: oci_config, region: region)
|
26
|
+
env[:oci_network] = ::OCI::Core::VirtualNetworkClient.new(config: oci_config, region: region)
|
27
|
+
env[:oci_identity] = ::OCI::Identity::IdentityClient.new(config: oci_config, region: region)
|
28
|
+
|
29
|
+
@@ad_list ||= {}
|
30
|
+
@@ad_list[oci_config.tenancy] ||= {}
|
31
|
+
@@ad_list[oci_config.tenancy][region] ||= env[:oci_identity].list_availability_domains(oci_config.tenancy).data.map(&:to_hash).sort_by {|i| i[:name]}
|
32
|
+
env[:ad_name] = @@ad_list[oci_config.tenancy][region][provider_config.ad.to_i - 1][:name]
|
33
|
+
|
34
|
+
@@compartment_list ||= env[:oci_identity].list_compartments(oci_config.tenancy, compartment_id_in_subtree: true).flat_map {|i| i}
|
35
|
+
compartment_map = @@compartment_list.flat_map {|i| i.data}.inject({}) {|a, v| a[v.name] = v.id; a}
|
36
|
+
if provider_config.server_compartment_id.nil? and provider_config.server_compartment_name
|
37
|
+
env[:machine].provider_config.server_compartment_id = compartment_map[provider_config.server_compartment_name]
|
38
|
+
end
|
39
|
+
if provider_config.image_id.nil? and provider_config.image_compartment_name
|
40
|
+
env[:machine].provider_config.image_compartment_id = compartment_map[provider_config.image_compartment_name]
|
41
|
+
end
|
42
|
+
if provider_config.subnet_vcn_compartment_id.nil? and provider_config.subnet_vcn_compartment_name
|
43
|
+
env[:machine].provider_config.subnet_vcn_compartment_id = compartment_map[provider_config.subnet_vcn_compartment_name]
|
44
|
+
end
|
45
|
+
if provider_config.subnet_compartment_id.nil? and provider_config.subnet_compartment_name
|
46
|
+
env[:machine].provider_config.subnet_compartment_id = compartment_map[provider_config.subnet_compartment_name]
|
47
|
+
end
|
48
|
+
|
49
|
+
if provider_config.image_regex
|
50
|
+
@@image_list ||= {}
|
51
|
+
@@image_list[oci_config.tenancy] ||= {}
|
52
|
+
@@image_list[oci_config.tenancy][region] ||= env[:oci_compute].list_images(provider_config.image_compartment_id).data.map(&:to_hash).sort_by {|i| i[:name]}.reverse
|
53
|
+
end
|
54
|
+
|
55
|
+
@app.call(env)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OCI
|
3
|
+
module Action
|
4
|
+
class IsStopped
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
ocid = env[:machine].id
|
11
|
+
|
12
|
+
instance_data = env[:oci_compute].get_instance(ocid).data.to_hash
|
13
|
+
env[:result] = %w[STOPPED STOPPING].include? instance_data[:lifecycleState].upcase
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OCI
|
3
|
+
module Action
|
4
|
+
class IsTerminated
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
ocid = env[:machine].id
|
11
|
+
instance_data = env[:oci_compute].get_instance(ocid).data.to_hash
|
12
|
+
env[:result] = %w[TERMINATED TERMINATING].include? instance_data[:lifecycleState].upcase
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OCI
|
3
|
+
module Action
|
4
|
+
class MessageAlreadyCreated
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t("vagrant_oci.already_created"))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action
|
6
|
+
# This action reads the SSH info for the machine and puts it into the
|
7
|
+
# `:machine_ssh_info` key in the environment.
|
8
|
+
class ReadSSHInfo
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::read_ssh_info")
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
env[:machine_ssh_info] = read_ssh_info(env)
|
16
|
+
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_ssh_info(env)
|
21
|
+
machine = env[:machine]
|
22
|
+
return nil if machine.id.nil?
|
23
|
+
|
24
|
+
server_ocid = env[:machine].id
|
25
|
+
provider_config = env[:machine].provider_config
|
26
|
+
vnic_attachments_data = env[:oci_compute].list_vnic_attachments(provider_config.server_compartment_id, :instance_id => server_ocid).data.map(&:to_hash)
|
27
|
+
vnic_id = vnic_attachments_data.first[:vnicId]
|
28
|
+
vnic_data = env[:oci_network].get_vnic(vnic_id).data.to_hash
|
29
|
+
private_ip = vnic_data[:privateIp]
|
30
|
+
public_ip = vnic_data[:publicIp]
|
31
|
+
ip_addr = provider_config.use_private_network ? private_ip : public_ip || private_ip
|
32
|
+
|
33
|
+
ssh_info = {
|
34
|
+
:host => ip_addr,
|
35
|
+
:port => env[:machine].config.ssh.port || 22
|
36
|
+
}
|
37
|
+
env[:machine_ssh_info] = ssh_info
|
38
|
+
|
39
|
+
# Return SSH network info
|
40
|
+
return ssh_info
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action
|
6
|
+
# This action reads the state of the machine and puts it in the
|
7
|
+
# `:machine_state_id` key in the environment.
|
8
|
+
class ReadState
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::read_state")
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
env[:machine_state_id] = read_state(env[:oci_compute], env[:machine])
|
16
|
+
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_state(oci, machine)
|
21
|
+
return :not_created if machine.id.nil?
|
22
|
+
|
23
|
+
# Find the machine
|
24
|
+
begin
|
25
|
+
server = oci.get_instance(machine.id)
|
26
|
+
rescue OCI::Errors::ServiceError
|
27
|
+
return :not_created
|
28
|
+
end
|
29
|
+
|
30
|
+
lifecycle_state = server.data.lifecycle_state
|
31
|
+
if lifecycle_state.nil? || %w[Stopped Terminating].include?(lifecycle_state)
|
32
|
+
# The machine can't be found
|
33
|
+
@logger.info("Machine not found or terminated, assuming it got destroyed.")
|
34
|
+
machine.id = nil
|
35
|
+
return :not_created
|
36
|
+
end
|
37
|
+
|
38
|
+
# Return the state
|
39
|
+
return lifecycle_state
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require 'vagrant/util/is_port_open'
|
3
|
+
require 'net/ssh'
|
4
|
+
require 'timeout'
|
5
|
+
|
6
|
+
module VagrantPlugins
|
7
|
+
module OCI
|
8
|
+
module Action
|
9
|
+
class RunInstance
|
10
|
+
include Vagrant::Util::IsPortOpen
|
11
|
+
|
12
|
+
def initialize(app, env)
|
13
|
+
@app = app
|
14
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::run_instance")
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
# Initialize metrics if they haven't been
|
19
|
+
env[:metrics] ||= {}
|
20
|
+
|
21
|
+
provider_config = env[:machine].provider_config
|
22
|
+
oci_config = env[:oci_config]
|
23
|
+
metadata = {}
|
24
|
+
metadata.store('hostname', env[:machine].name)
|
25
|
+
|
26
|
+
if provider_config.image_regex and provider_config.image_id.nil?
|
27
|
+
@@image_list ||= {}
|
28
|
+
@@image_list[oci_config.tenancy] ||= {}
|
29
|
+
@@image_list[oci_config.tenancy][provider_config.region] ||= env[:oci_compute].list_images(provider_config.image_compartment_id).data.map(&:to_hash).sort_by {|i| i['display-name']}.reverse
|
30
|
+
r = Regexp.new(provider_config.image_regex)
|
31
|
+
provider_config.image_id = @@image_list[oci_config.tenancy][provider_config.region].filter {|i| r.match(i[:displayName])}.first[:id]
|
32
|
+
end
|
33
|
+
|
34
|
+
if provider_config.subnet_id.nil? and provider_config.subnet_vcn_compartment_name and provider_config.subnet_vcn_dns_label and provider_config.subnet_compartment_name and provider_config.subnet_dns_label
|
35
|
+
@@vcn_list ||= {}
|
36
|
+
@@vcn_list[oci_config.tenancy] ||= {}
|
37
|
+
@@vcn_list[oci_config.tenancy][provider_config.region] ||= env[:oci_network].list_vcns(provider_config.subnet_vcn_compartment_id).data.map(&:to_hash)
|
38
|
+
vcn_map = @@vcn_list[oci_config.tenancy][provider_config.region].inject({}) {|a, v| a[v[:dnsLabel]] = v[:id]; a}
|
39
|
+
vcn_id = vcn_map[provider_config.subnet_vcn_dns_label]
|
40
|
+
|
41
|
+
@@subnet_list ||= {}
|
42
|
+
@@subnet_list[oci_config.tenancy] ||= {}
|
43
|
+
@@subnet_list[oci_config.tenancy][provider_config.region] ||= {}
|
44
|
+
@@subnet_list[oci_config.tenancy][provider_config.region][vcn_id] ||= env[:oci_network].list_subnets(provider_config.subnet_compartment_id, vcn_id).data.map(&:to_hash)
|
45
|
+
subnet_map = @@subnet_list[oci_config.tenancy][provider_config.region][vcn_id].inject({}) {|a, v| a[v[:dnsLabel]] = v[:id]; a}
|
46
|
+
provider_config.subnet_id = subnet_map[provider_config.subnet_dns_label]
|
47
|
+
end
|
48
|
+
|
49
|
+
create_vnic_details = ::OCI::Core::Models::CreateVnicDetails.new(:subnet_id => provider_config.subnet_id)
|
50
|
+
|
51
|
+
ssh_private_key_path = env[:machine].config.ssh.private_key_path.first
|
52
|
+
ssh_private_key = File.read(File.expand_path(ssh_private_key_path)).chomp
|
53
|
+
key = OpenSSL::PKey::RSA.new(ssh_private_key)
|
54
|
+
type = key.ssh_type
|
55
|
+
data = [key.to_blob].pack('m0')
|
56
|
+
openssh_pubkey = "#{type} #{data}"
|
57
|
+
metadata.store('ssh_authorized_keys', openssh_pubkey)
|
58
|
+
|
59
|
+
api_request = ::OCI::Core::Models::LaunchInstanceDetails.new
|
60
|
+
api_request.availability_domain = env[:ad_name]
|
61
|
+
api_request.compartment_id = provider_config.server_compartment_id
|
62
|
+
api_request.display_name = env[:machine].name
|
63
|
+
api_request.shape = provider_config.shape
|
64
|
+
api_request.image_id = provider_config.image_id
|
65
|
+
api_request.metadata = metadata
|
66
|
+
api_request.create_vnic_details = create_vnic_details
|
67
|
+
api_request.freeform_tags = provider_config.freeform_tags
|
68
|
+
api_request.defined_tags = provider_config.defined_tags
|
69
|
+
compute_api = env[:oci_compute]
|
70
|
+
|
71
|
+
request_start_time = Time.now.to_i
|
72
|
+
puts "Launching new instance .."
|
73
|
+
ci = launch_instance_data = env[:oci_compute].launch_instance(api_request).data.to_hash
|
74
|
+
env[:machine].id = ci[:id]
|
75
|
+
|
76
|
+
vnic_attachments_data = nil
|
77
|
+
puts "Waiting for vnic attachments .."
|
78
|
+
loop do
|
79
|
+
vnic_attachments_data = env[:oci_compute].list_vnic_attachments(provider_config.server_compartment_id, :instance_id => ci[:id]).data.map(&:to_hash)
|
80
|
+
break if vnic_attachments_data.any?
|
81
|
+
sleep 5
|
82
|
+
end
|
83
|
+
|
84
|
+
vnic_id = vnic_attachments_data.first[:vnicId]
|
85
|
+
vnic_data = env[:oci_network].get_vnic(vnic_id).data.to_hash
|
86
|
+
private_ip = vnic_data[:privateIp]
|
87
|
+
public_ip = vnic_data[:publicIp]
|
88
|
+
ip_addr = provider_config.use_private_network ? private_ip : public_ip || private_ip
|
89
|
+
|
90
|
+
env[:ui].info(I18n.t("vagrant_oci.waiting_for_ready"))
|
91
|
+
original_stderr = $stderr.clone
|
92
|
+
$stderr.reopen(File.new(IO::NULL, 'w'))
|
93
|
+
begin
|
94
|
+
loop do
|
95
|
+
conn = nil
|
96
|
+
begin
|
97
|
+
Timeout::timeout(10) do
|
98
|
+
conn = Net::SSH.start(ip_addr, env[:machine].config.ssh.username, key_data: [ssh_private_key])
|
99
|
+
end
|
100
|
+
rescue
|
101
|
+
conn = nil
|
102
|
+
end
|
103
|
+
break if conn
|
104
|
+
end
|
105
|
+
$stderr.reopen(original_stderr)
|
106
|
+
env[:metrics]["instance_ready_time"] = Time.now.to_i - request_start_time
|
107
|
+
@logger.info("Time for instance ready: #{env[:metrics]["instance_ready_time"]}")
|
108
|
+
env[:ui].info(I18n.t("vagrant_oci.ready"))
|
109
|
+
rescue
|
110
|
+
env[:interrupted] = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action
|
6
|
+
# This stops the running instance.
|
7
|
+
class StartInstance
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::start_instance")
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
return :not_created if env[:machine].id.nil?
|
15
|
+
|
16
|
+
begin
|
17
|
+
server = env[:oci_compute].get_instance(env[:machine].id)
|
18
|
+
rescue OCI::Errors::ServiceError
|
19
|
+
return :not_created
|
20
|
+
end
|
21
|
+
lifecycle_state = server.data.lifecycle_state.upcase
|
22
|
+
if %w[STARTING RUNNING].include?(lifecycle_state)
|
23
|
+
env[:ui].info(I18n.t("vagrant_oci.already_status", :status => lifecycle_state))
|
24
|
+
else
|
25
|
+
env[:ui].info(I18n.t("vagrant_oci.starting"))
|
26
|
+
env[:oci_compute].instance_action(env[:machine].id, 'START')
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.call(env)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action
|
6
|
+
# This stops the running instance.
|
7
|
+
class StopInstance
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::stop_instance")
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
return :not_created if env[:machine].id.nil?
|
15
|
+
|
16
|
+
begin
|
17
|
+
server = env[:oci_compute].get_instance(env[:machine].id)
|
18
|
+
rescue OCI::Errors::ServiceError
|
19
|
+
return :not_created
|
20
|
+
end
|
21
|
+
lifecycle_state = server.data.lifecycle_state.upcase
|
22
|
+
if %w[STOPPED STOPPING].include?(lifecycle_state)
|
23
|
+
env[:ui].info(I18n.t("vagrant_oci.already_status", :status => lifecycle_state))
|
24
|
+
else
|
25
|
+
env[:ui].info(I18n.t("vagrant_oci.stopping"))
|
26
|
+
env[:oci_compute].instance_action(env[:machine].id, 'STOP')
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.call(env)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
module Action
|
6
|
+
class TerminateInstance
|
7
|
+
def initialize(app, env)
|
8
|
+
@app = app
|
9
|
+
@logger = Log4r::Logger.new("vagrant_oci::action::terminate_instance")
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
server_ocid = env[:machine].id
|
14
|
+
return nil if server_ocid.nil?
|
15
|
+
|
16
|
+
env[:ui].info(I18n.t("vagrant_oci.terminating"))
|
17
|
+
env[:oci_compute].terminate_instance(server_ocid)
|
18
|
+
env[:machine].id = nil
|
19
|
+
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OCI
|
3
|
+
module Action
|
4
|
+
class WarnNetworks
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
# Default SSH forward always exists so "> 1"
|
11
|
+
if env[:machine].config.vm.networks.length > 1
|
12
|
+
env[:ui].warn(I18n.t("vagrant_oci.warn_networks"))
|
13
|
+
end
|
14
|
+
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OCI
|
3
|
+
module Action
|
4
|
+
class WarnSshKeys
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
# Warn on ssh-key overrides
|
11
|
+
if env[:machine].config.ssh.username.nil?
|
12
|
+
env[:ui].warn(I18n.t("vagrant_oci.warn_ssh_vagrant_user"))
|
13
|
+
end
|
14
|
+
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
class Config < Vagrant.plugin("2", :config)
|
6
|
+
attr_accessor :ad
|
7
|
+
attr_accessor :config_file
|
8
|
+
attr_accessor :defined_tags
|
9
|
+
attr_accessor :freeform_tags
|
10
|
+
attr_accessor :image_compartment_id
|
11
|
+
attr_accessor :image_compartment_name
|
12
|
+
attr_accessor :image_id
|
13
|
+
attr_accessor :image_regex
|
14
|
+
attr_accessor :profile
|
15
|
+
attr_accessor :region
|
16
|
+
attr_accessor :server_compartment_id
|
17
|
+
attr_accessor :server_compartment_name
|
18
|
+
attr_accessor :shape
|
19
|
+
attr_accessor :subnet_compartment_id
|
20
|
+
attr_accessor :subnet_compartment_name
|
21
|
+
attr_accessor :subnet_dns_label
|
22
|
+
attr_accessor :subnet_id
|
23
|
+
attr_accessor :subnet_vcn_compartment_id
|
24
|
+
attr_accessor :subnet_vcn_compartment_name
|
25
|
+
attr_accessor :subnet_vcn_dns_label
|
26
|
+
attr_accessor :use_private_network
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
begin
|
2
|
+
require "vagrant"
|
3
|
+
rescue LoadError
|
4
|
+
raise "The Vagrant OCI plugin must be run within Vagrant."
|
5
|
+
end
|
6
|
+
|
7
|
+
# This is a sanity check to make sure no one is attempting to install
|
8
|
+
# this into an early Vagrant version.
|
9
|
+
if Vagrant::VERSION < "1.2.0"
|
10
|
+
raise "The Vagrant OCI plugin is only compatible with Vagrant 1.2+"
|
11
|
+
end
|
12
|
+
|
13
|
+
module VagrantPlugins
|
14
|
+
module OCI
|
15
|
+
class Plugin < Vagrant.plugin("2")
|
16
|
+
name "OCI"
|
17
|
+
description <<-DESC
|
18
|
+
This plugin installs a provider that allows Vagrant to manage
|
19
|
+
machines in OCI.
|
20
|
+
DESC
|
21
|
+
|
22
|
+
config(:oci, :provider) do
|
23
|
+
require_relative "config"
|
24
|
+
Config
|
25
|
+
end
|
26
|
+
|
27
|
+
provider(:oci, parallel: true) do
|
28
|
+
setup_logging
|
29
|
+
setup_i18n
|
30
|
+
|
31
|
+
require_relative "provider"
|
32
|
+
Provider
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.setup_i18n
|
36
|
+
I18n.load_path << File.expand_path("locales/en.yml", OCI.source_root)
|
37
|
+
I18n.reload!
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.setup_logging
|
41
|
+
require "log4r"
|
42
|
+
|
43
|
+
level = nil
|
44
|
+
begin
|
45
|
+
level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
|
46
|
+
rescue NameError
|
47
|
+
# This means that the logging constant wasn't found,
|
48
|
+
# which is fine. We just keep `level` as `nil`. But
|
49
|
+
# we tell the user.
|
50
|
+
level = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
# Some constants, such as "true" resolve to booleans, so the
|
54
|
+
# above error checking doesn't catch it. This will check to make
|
55
|
+
# sure that the log level is an integer, as Log4r requires.
|
56
|
+
level = nil if !level.is_a?(Integer)
|
57
|
+
|
58
|
+
# Set the logging level on all "vagrant" namespaced
|
59
|
+
# logs as long as we have a valid level.
|
60
|
+
if level
|
61
|
+
logger = Log4r::Logger.new("vagrant_oci")
|
62
|
+
logger.outputters = Log4r::Outputter.stderr
|
63
|
+
logger.level = level
|
64
|
+
logger = nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OCI
|
5
|
+
class Provider < Vagrant.plugin("2", :provider)
|
6
|
+
def initialize(machine)
|
7
|
+
@machine = machine
|
8
|
+
@machine.config.nfs.functional = false unless ENV.has_key?('VAGRANT_OCI_ENABLE_NFS')
|
9
|
+
@machine.config.smb.functional = false unless ENV.has_key?('VAGRANT_OCI_ENABLE_SMB')
|
10
|
+
end
|
11
|
+
|
12
|
+
def action(name)
|
13
|
+
# Attempt to get the action method from the Action class if it
|
14
|
+
# exists, otherwise return nil to show that we don't support the
|
15
|
+
# given action.
|
16
|
+
action_method = "action_#{name}"
|
17
|
+
return Action.send(action_method) if Action.respond_to?(action_method)
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def ssh_info
|
22
|
+
env = @machine.action("read_ssh_info")
|
23
|
+
env[:machine_ssh_info]
|
24
|
+
end
|
25
|
+
|
26
|
+
def state
|
27
|
+
env = @machine.action("read_state")
|
28
|
+
|
29
|
+
state_id = env[:machine_state_id]
|
30
|
+
|
31
|
+
# Get the short and long description
|
32
|
+
short = I18n.t("vagrant_oci.states.short_#{state_id}")
|
33
|
+
long = I18n.t("vagrant_oci.states.long_#{state_id}")
|
34
|
+
|
35
|
+
# Return the MachineState object
|
36
|
+
Vagrant::MachineState.new(state_id, short, long)
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
id = @machine.id.nil? ? "new" : @machine.id
|
41
|
+
"OCI (#{id})"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_oci:
|
3
|
+
warn_networks: |-
|
4
|
+
Warning! The AWS provider doesn't support any of the Vagrant
|
5
|
+
high-level network configurations (`config.vm.network`). They
|
6
|
+
will be silently ignored.
|
7
|
+
warn_ssh_vagrant_user: |-
|
8
|
+
Warning! SSH credentials are not set (`ssh.username`, `ssh.private_key`).
|
9
|
+
waiting_for_ready: |-
|
10
|
+
Waiting for instance to become "ready"...
|
11
|
+
ready: |-
|
12
|
+
Machine is booted and ready for use!
|
13
|
+
already_created: |-
|
14
|
+
The machine is already created.
|
15
|
+
not_created: |-
|
16
|
+
Instance is not created. Please run `vagrant up` first.
|
17
|
+
terminating: |-
|
18
|
+
Terminating the instance...
|
19
|
+
already_status: |-
|
20
|
+
The machine is already %{status}.
|
21
|
+
stopping: |-
|
22
|
+
Stopping the instance...
|
23
|
+
starting: |-
|
24
|
+
Starting the instance...
|
25
|
+
states:
|
26
|
+
short_not_created: |-
|
27
|
+
not created
|
28
|
+
long_not_created: |-
|
29
|
+
The OCI instance is not created. Run `vagrant up` to create it.
|
30
|
+
|
31
|
+
short_PROVISIONING: |-
|
32
|
+
provsioning
|
33
|
+
long_PROVISIONING: |-
|
34
|
+
Resources are being reserved for this instance. This instance is
|
35
|
+
not yet running.
|
36
|
+
|
37
|
+
short_STARTING: |-
|
38
|
+
starting
|
39
|
+
long_STARTING: |-
|
40
|
+
The OCI instance is starting up.
|
41
|
+
|
42
|
+
short_STOPPING: |-
|
43
|
+
stopping
|
44
|
+
long_STOPPING: |-
|
45
|
+
The OCI instance is stopping. Wait until is completely stopped to
|
46
|
+
run `vagrant up` and start it.
|
47
|
+
|
48
|
+
short_RUNNING: |-
|
49
|
+
running
|
50
|
+
long_RUNNING: |-
|
51
|
+
The OCI instance is running. To stop this machine, you can run
|
52
|
+
`vagrant halt`. To destroy the machine, you can run `vagrant destroy`.
|
53
|
+
|
54
|
+
short_STOPPED: |-
|
55
|
+
stopped
|
56
|
+
long_STOPPED: |-
|
57
|
+
The OCI instance has been shut down. To start the instance up again
|
58
|
+
you can run `vagrant up`.
|
59
|
+
|
60
|
+
short_TERMINATING: |-
|
61
|
+
terminating
|
62
|
+
long_TERMINATING: |-
|
63
|
+
The OCI instance is being terminated. To start the instance up again
|
64
|
+
you can run `vagrant up`.
|
65
|
+
|
66
|
+
short_TERMINATED: |-
|
67
|
+
terminated
|
68
|
+
long_TERMINATED: |-
|
69
|
+
The OCI instance was terminated for some reason. You can
|
70
|
+
attempt to restart the instance by running `vagrant up`.
|
data/vagrant-oci.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-oci/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "vagrant-oci"
|
8
|
+
spec.version = VagrantPlugins::OCI::VERSION
|
9
|
+
spec.authors = ["Stephen Pearson"]
|
10
|
+
spec.email = ["stephen.pearson@oracle.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Create instances in Oracle OCI..}
|
13
|
+
spec.description = %q{Create instances in Oracle OCI.}
|
14
|
+
spec.homepage = "https://github.com/stephenpearson/vagrant-oci.git"
|
15
|
+
|
16
|
+
# Specify which files should be added to the gem when it is released.
|
17
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
18
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
19
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
+
end
|
21
|
+
spec.bindir = "bin"
|
22
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
|
28
|
+
spec.add_runtime_dependency 'oci', '~> 2.5'
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-oci
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stephen Pearson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-06-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: oci
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.5'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.5'
|
55
|
+
description: Create instances in Oracle OCI.
|
56
|
+
email:
|
57
|
+
- stephen.pearson@oracle.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- Gemfile
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- Vagrantfile.sample/Vagrantfile
|
67
|
+
- Vagrantfile.sample/site.yml
|
68
|
+
- example_box/README.md
|
69
|
+
- example_box/Vagrantfile
|
70
|
+
- example_box/metadata.json
|
71
|
+
- lib/vagrant-oci.rb
|
72
|
+
- lib/vagrant-oci/action.rb
|
73
|
+
- lib/vagrant-oci/action/connect_oci.rb
|
74
|
+
- lib/vagrant-oci/action/is_created.rb
|
75
|
+
- lib/vagrant-oci/action/is_stopped.rb
|
76
|
+
- lib/vagrant-oci/action/is_terminated.rb
|
77
|
+
- lib/vagrant-oci/action/message_already_created.rb
|
78
|
+
- lib/vagrant-oci/action/message_not_created.rb
|
79
|
+
- lib/vagrant-oci/action/read_ssh_info.rb
|
80
|
+
- lib/vagrant-oci/action/read_state.rb
|
81
|
+
- lib/vagrant-oci/action/run_instance.rb
|
82
|
+
- lib/vagrant-oci/action/start_instance.rb
|
83
|
+
- lib/vagrant-oci/action/stop_instance.rb
|
84
|
+
- lib/vagrant-oci/action/terminate_instance.rb
|
85
|
+
- lib/vagrant-oci/action/warn_networks.rb
|
86
|
+
- lib/vagrant-oci/action/warn_ssh_keys.rb
|
87
|
+
- lib/vagrant-oci/config.rb
|
88
|
+
- lib/vagrant-oci/plugin.rb
|
89
|
+
- lib/vagrant-oci/provider.rb
|
90
|
+
- lib/vagrant-oci/version.rb
|
91
|
+
- locales/en.yml
|
92
|
+
- vagrant-oci.gemspec
|
93
|
+
homepage: https://github.com/stephenpearson/vagrant-oci.git
|
94
|
+
licenses: []
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubygems_version: 3.0.1
|
112
|
+
signing_key:
|
113
|
+
specification_version: 4
|
114
|
+
summary: Create instances in Oracle OCI..
|
115
|
+
test_files: []
|