knife-oci 2.0.0 → 2.0.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 +4 -4
- data/lib/chef/knife/oci_helper.rb +0 -30
- data/lib/chef/knife/oci_helper_show.rb +108 -0
- data/lib/chef/knife/oci_server_create.rb +6 -20
- data/lib/chef/knife/oci_server_delete.rb +9 -1
- data/lib/chef/knife/oci_server_show.rb +6 -72
- data/lib/knife-oci/version.rb +1 -1
- metadata +23 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f461931833d1c8eaf21ee448e8402f49eb4c10c7
|
4
|
+
data.tar.gz: 8d6715c84720b950ed4661b484895fd3cfa89216
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36c6507626cbd2e23b32c805d7cf4babb281ea2a03dbdd2ab6ae1c86de603f8d133e9cd2c6c5aff00342630947e2d57a7ca5dbcdfe65d52a6873f165251a0cf9
|
7
|
+
data.tar.gz: 47a873568be4eaf52b67c1c563906c450e3300c1341b527e84875f506540eb25e5d2a49969089775967c5a5ed9032dbf226829e6aa759eca7e8b5a84415a8a88
|
@@ -173,36 +173,6 @@ class Chef
|
|
173
173
|
else
|
174
174
|
return response
|
175
175
|
end
|
176
|
-
|
177
|
-
def show_value(key, value, color = :cyan)
|
178
|
-
ui.msg "#{ui.color(key, color)}: #{value}" if value && !value.to_s.empty?
|
179
|
-
end
|
180
|
-
|
181
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
182
|
-
def display_server_info(config, instance, vnics)
|
183
|
-
show_value('Display Name', instance.display_name)
|
184
|
-
show_value('Instance ID', instance.id)
|
185
|
-
show_value('Lifecycle State', instance.lifecycle_state)
|
186
|
-
show_value('Availability Domain', instance.availability_domain)
|
187
|
-
show_value('Compartment Name', instance.compartment_name) if instance.respond_to? :compartment_name
|
188
|
-
show_value('Compartment ID', instance.compartment_id)
|
189
|
-
show_value('Region', instance.region)
|
190
|
-
show_value('Image Name', instance.image_name) if instance.respond_to? :image_name
|
191
|
-
show_value('Image ID', instance.image_id)
|
192
|
-
show_value('Shape', instance.shape)
|
193
|
-
show_value('VCN Name', instance.vcn_name) if instance.respond_to? :vcn_name
|
194
|
-
show_value('VCN ID', instance.vcn_id) if instance.respond_to? :vcn_id
|
195
|
-
show_value('Launched', instance.launchtime) if instance.respond_to? :launchtime
|
196
|
-
vnics.each_index do |index|
|
197
|
-
prefix = vnics[index].is_primary ? 'Primary' : 'Secondary'
|
198
|
-
show_value("#{prefix} Public IP Address", vnics[index].public_ip)
|
199
|
-
show_value("#{prefix} Private IP Address", vnics[index].private_ip)
|
200
|
-
show_value("#{prefix} Hostname", vnics[index].hostname_label)
|
201
|
-
show_value("#{prefix} FQDN", vnics[index].fqdn) if vnics[index].respond_to? :fqdn
|
202
|
-
show_value("#{prefix} Subnet Name", vnics[index].subnet_name) if vnics[index].respond_to? :subnet_name
|
203
|
-
end
|
204
|
-
show_value('Node Name', config[:chef_node_name])
|
205
|
-
end
|
206
176
|
end
|
207
177
|
end
|
208
178
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
|
2
|
+
|
3
|
+
require 'chef/knife'
|
4
|
+
require 'knife-oci/version'
|
5
|
+
|
6
|
+
# Methods to extend the instance model
|
7
|
+
module ServerDetails
|
8
|
+
attr_accessor :compartment_name
|
9
|
+
attr_accessor :image_name
|
10
|
+
attr_accessor :launchtime
|
11
|
+
attr_accessor :vcn_id
|
12
|
+
attr_accessor :vcn_name
|
13
|
+
end
|
14
|
+
|
15
|
+
# Methods to extend the vnic model
|
16
|
+
module VnicDetails
|
17
|
+
attr_accessor :fqdn
|
18
|
+
attr_accessor :subnet_name
|
19
|
+
attr_accessor :vcn_id
|
20
|
+
end
|
21
|
+
|
22
|
+
class Chef
|
23
|
+
class Knife
|
24
|
+
# Utility routines to fill out data for 'server show' functionality
|
25
|
+
module OciHelperShow
|
26
|
+
def lookup_compartment_name(compartment_id)
|
27
|
+
compartment = identity_client.get_compartment(compartment_id, {})
|
28
|
+
rescue OCI::Errors::ServiceError => service_error
|
29
|
+
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
30
|
+
else
|
31
|
+
compartment.data.name
|
32
|
+
end
|
33
|
+
|
34
|
+
def lookup_image_name(image_id)
|
35
|
+
image = compute_client.get_image(image_id, {})
|
36
|
+
rescue OCI::Errors::ServiceError => service_error
|
37
|
+
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
38
|
+
else
|
39
|
+
image.data.display_name
|
40
|
+
end
|
41
|
+
|
42
|
+
def lookup_vcn_name(vcn_id)
|
43
|
+
vcn = network_client.get_vcn(vcn_id, {})
|
44
|
+
rescue OCI::Errors::ServiceError => service_error
|
45
|
+
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
46
|
+
else
|
47
|
+
vcn.data.display_name
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_server_details(server, vcn_id)
|
51
|
+
server.extend ServerDetails
|
52
|
+
|
53
|
+
server.launchtime = server.time_created.strftime('%a, %e %b %Y %T %Z')
|
54
|
+
server.compartment_name = lookup_compartment_name(server.compartment_id)
|
55
|
+
server.image_name = lookup_image_name(server.image_id)
|
56
|
+
server.vcn_id = vcn_id
|
57
|
+
server.vcn_name = lookup_vcn_name(vcn_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_vnic_details(vnic)
|
61
|
+
vnic.extend VnicDetails
|
62
|
+
|
63
|
+
begin
|
64
|
+
subnet = network_client.get_subnet(vnic.subnet_id, {})
|
65
|
+
rescue OCI::Errors::ServiceError => service_error
|
66
|
+
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
67
|
+
else
|
68
|
+
vnic.fqdn = vnic.hostname_label + '.' + subnet.data.subnet_domain_name if
|
69
|
+
subnet.data && subnet.data.subnet_domain_name && vnic.hostname_label
|
70
|
+
vnic.subnet_name = subnet.data.display_name if
|
71
|
+
subnet.data && subnet.data.display_name
|
72
|
+
# piggyback the vcn_id from here, so we can avoid a few network calls
|
73
|
+
vnic.vcn_id = subnet.data.vcn_id
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def show_value(key, value, color = :cyan)
|
78
|
+
ui.msg "#{ui.color(key, color)}: #{value}" if value && !value.to_s.empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
82
|
+
def display_server_info(config, instance, vnics)
|
83
|
+
show_value('Display Name', instance.display_name)
|
84
|
+
show_value('Instance ID', instance.id)
|
85
|
+
show_value('Lifecycle State', instance.lifecycle_state)
|
86
|
+
show_value('Availability Domain', instance.availability_domain)
|
87
|
+
show_value('Compartment Name', instance.compartment_name) if instance.respond_to? :compartment_name
|
88
|
+
show_value('Compartment ID', instance.compartment_id)
|
89
|
+
show_value('Region', instance.region)
|
90
|
+
show_value('Image Name', instance.image_name) if instance.respond_to? :image_name
|
91
|
+
show_value('Image ID', instance.image_id)
|
92
|
+
show_value('Shape', instance.shape)
|
93
|
+
show_value('VCN Name', instance.vcn_name) if instance.respond_to? :vcn_name
|
94
|
+
show_value('VCN ID', instance.vcn_id) if instance.respond_to? :vcn_id
|
95
|
+
show_value('Launched', instance.launchtime) if instance.respond_to? :launchtime
|
96
|
+
vnics.each_index do |index|
|
97
|
+
prefix = vnics[index].is_primary ? 'Primary' : 'Secondary'
|
98
|
+
show_value("#{prefix} Public IP Address", vnics[index].public_ip)
|
99
|
+
show_value("#{prefix} Private IP Address", vnics[index].private_ip)
|
100
|
+
show_value("#{prefix} Hostname", vnics[index].hostname_label)
|
101
|
+
show_value("#{prefix} FQDN", vnics[index].fqdn) if vnics[index].respond_to? :fqdn
|
102
|
+
show_value("#{prefix} Subnet Name", vnics[index].subnet_name) if vnics[index].respond_to? :subnet_name
|
103
|
+
end
|
104
|
+
show_value('Node Name', config[:chef_node_name])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'chef/knife'
|
4
4
|
require 'chef/knife/oci_helper'
|
5
|
+
require 'chef/knife/oci_helper_show'
|
5
6
|
require 'chef/knife/oci_common_options'
|
6
7
|
|
7
8
|
class Chef
|
@@ -11,13 +12,14 @@ class Chef
|
|
11
12
|
banner 'knife oci server create (options)'
|
12
13
|
|
13
14
|
include OciHelper
|
15
|
+
include OciHelperShow
|
14
16
|
include OciCommonOptions
|
15
17
|
|
16
18
|
# Port for SSH - might want to parameterize this in the future.
|
17
19
|
SSH_PORT = 22
|
18
20
|
|
19
21
|
WAIT_FOR_SSH_INTERVAL_SECONDS = 2
|
20
|
-
DEFAULT_WAIT_FOR_SSH_MAX_SECONDS =
|
22
|
+
DEFAULT_WAIT_FOR_SSH_MAX_SECONDS = 300
|
21
23
|
DEFAULT_WAIT_TO_STABILIZE_SECONDS = 40
|
22
24
|
|
23
25
|
deps do
|
@@ -26,14 +28,6 @@ class Chef
|
|
26
28
|
Chef::Knife::Bootstrap.load_deps
|
27
29
|
end
|
28
30
|
|
29
|
-
option :oci_config_file,
|
30
|
-
long: '--oci-config-file FILE',
|
31
|
-
description: 'The path to the OCI config file. Default: ~/.oci/config'
|
32
|
-
|
33
|
-
option :oci_profile,
|
34
|
-
long: '--oci-profile PROFILE',
|
35
|
-
description: 'The profile to load from the OCI config file. Default: DEFAULT'
|
36
|
-
|
37
31
|
option :availability_domain,
|
38
32
|
long: '--availability-domain AD',
|
39
33
|
description: 'The Availability Domain of the instance. (required)'
|
@@ -135,21 +129,10 @@ class Chef
|
|
135
129
|
instance = response.data
|
136
130
|
|
137
131
|
ui.msg "Launched instance '#{instance.display_name}' [#{instance.id}]"
|
138
|
-
show_value('Display Name', instance.display_name)
|
139
|
-
show_value('Instance ID', instance.id)
|
140
|
-
show_value('Availability Domain', instance.availability_domain)
|
141
|
-
show_value('Compartment ID', instance.compartment_id)
|
142
|
-
show_value('Region', instance.region)
|
143
|
-
show_value('Image ID', instance.image_id)
|
144
|
-
show_value('Shape', instance.shape)
|
145
|
-
|
146
132
|
instance = wait_for_instance_running(instance.id)
|
147
|
-
|
148
133
|
ui.msg "Instance '#{instance.display_name}' is now running."
|
149
134
|
|
150
135
|
vnic = get_vnic(instance.id, instance.compartment_id)
|
151
|
-
show_value('Public IP Address', vnic.public_ip)
|
152
|
-
show_value('Private IP Address', vnic.private_ip)
|
153
136
|
|
154
137
|
unless wait_for_ssh(vnic.public_ip, SSH_PORT, WAIT_FOR_SSH_INTERVAL_SECONDS, config[:wait_for_ssh_max])
|
155
138
|
error_and_exit 'Timed out while waiting for SSH access.'
|
@@ -167,6 +150,9 @@ class Chef
|
|
167
150
|
ui.msg "Created and bootstrapped node '#{config[:chef_node_name]}'."
|
168
151
|
ui.msg "\n"
|
169
152
|
|
153
|
+
add_vnic_details(vnic)
|
154
|
+
add_server_details(instance, vnic.vcn_id)
|
155
|
+
|
170
156
|
display_server_info(config, instance, [vnic])
|
171
157
|
end
|
172
158
|
|
@@ -31,7 +31,7 @@ class Chef
|
|
31
31
|
|
32
32
|
option :purge,
|
33
33
|
long: '--purge',
|
34
|
-
description: 'Remove the corresponding node from the Chef Server. The instance display name will be used as the node name, unless --node-name is specified.'
|
34
|
+
description: 'Remove the corresponding node and client from the Chef Server. The instance display name will be used as the node name, unless --node-name is specified.'
|
35
35
|
|
36
36
|
option :chef_node_name,
|
37
37
|
short: '-N NAME',
|
@@ -62,6 +62,7 @@ class Chef
|
|
62
62
|
|
63
63
|
terminate_instance(config[:instance_id])
|
64
64
|
delete_chef_node(chef_node) if config[:purge]
|
65
|
+
delete_chef_client(node_name) if config[:purge]
|
65
66
|
|
66
67
|
wait_for_instance_terminated(config[:instance_id], wait_for) if wait_for
|
67
68
|
end
|
@@ -82,6 +83,13 @@ class Chef
|
|
82
83
|
ui.msg "Deleted Chef node '#{node.name}'"
|
83
84
|
end
|
84
85
|
|
86
|
+
def delete_chef_client(client_name)
|
87
|
+
object = Chef::ApiClient.load(client_name)
|
88
|
+
return unless object && !object.validator
|
89
|
+
object.destroy
|
90
|
+
ui.msg "Deleted Chef client '#{client_name}'"
|
91
|
+
end
|
92
|
+
|
85
93
|
def wait_for_instance_terminated(instance_id, wait_for)
|
86
94
|
print ui.color('Waiting for instance to terminate...', :magenta)
|
87
95
|
begin
|
@@ -3,31 +3,16 @@
|
|
3
3
|
require 'chef/knife'
|
4
4
|
require 'chef/knife/oci_common_options'
|
5
5
|
require 'chef/knife/oci_helper'
|
6
|
-
|
7
|
-
# Methods to extend the instance model
|
8
|
-
module ServerDetails
|
9
|
-
attr_accessor :compartment_name
|
10
|
-
attr_accessor :image_name
|
11
|
-
attr_accessor :launchtime
|
12
|
-
attr_accessor :vcn_id
|
13
|
-
attr_accessor :vcn_name
|
14
|
-
end
|
15
|
-
|
16
|
-
# Methods to extend the vnic model
|
17
|
-
module VnicDetails
|
18
|
-
attr_accessor :fqdn
|
19
|
-
attr_accessor :subnet_name
|
20
|
-
attr_accessor :vcn_id
|
21
|
-
end
|
6
|
+
require 'chef/knife/oci_helper_show'
|
22
7
|
|
23
8
|
class Chef
|
24
9
|
class Knife
|
25
|
-
# List
|
26
|
-
# compartment, not just those that are set up as Chef nodes.
|
10
|
+
# List details of a particular OCI instance.
|
27
11
|
class OciServerShow < Knife
|
28
12
|
banner 'knife oci server show (options)'
|
29
13
|
|
30
14
|
include OciHelper
|
15
|
+
include OciHelperShow
|
31
16
|
include OciCommonOptions
|
32
17
|
|
33
18
|
deps do
|
@@ -35,60 +20,9 @@ class Chef
|
|
35
20
|
end
|
36
21
|
|
37
22
|
option :instance_id,
|
38
|
-
long: '--instance_id
|
23
|
+
long: '--instance_id INSTANCE',
|
39
24
|
description: 'The OCID of the server to display. (required)'
|
40
25
|
|
41
|
-
def lookup_compartment_name(compartment_id)
|
42
|
-
compartment = identity_client.get_compartment(compartment_id, {})
|
43
|
-
rescue OCI::Errors::ServiceError => service_error
|
44
|
-
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
45
|
-
else
|
46
|
-
compartment.data.name
|
47
|
-
end
|
48
|
-
|
49
|
-
def lookup_image_name(image_id)
|
50
|
-
image = compute_client.get_image(image_id, {})
|
51
|
-
rescue OCI::Errors::ServiceError => service_error
|
52
|
-
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
53
|
-
else
|
54
|
-
image.data.display_name
|
55
|
-
end
|
56
|
-
|
57
|
-
def lookup_vcn_name(vcn_id)
|
58
|
-
vcn = network_client.get_vcn(vcn_id, {})
|
59
|
-
rescue OCI::Errors::ServiceError => service_error
|
60
|
-
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
61
|
-
else
|
62
|
-
vcn.data.display_name
|
63
|
-
end
|
64
|
-
|
65
|
-
def add_server_details(server, vcn_id)
|
66
|
-
server.extend ServerDetails
|
67
|
-
|
68
|
-
server.launchtime = server.time_created.strftime('%a, %e %b %Y %T %Z')
|
69
|
-
server.compartment_name = lookup_compartment_name(server.compartment_id)
|
70
|
-
server.image_name = lookup_image_name(server.image_id)
|
71
|
-
server.vcn_id = vcn_id
|
72
|
-
server.vcn_name = lookup_vcn_name(vcn_id)
|
73
|
-
end
|
74
|
-
|
75
|
-
def add_vnic_details(vnic)
|
76
|
-
vnic.extend VnicDetails
|
77
|
-
|
78
|
-
begin
|
79
|
-
subnet = network_client.get_subnet(vnic.subnet_id, {})
|
80
|
-
rescue OCI::Errors::ServiceError => service_error
|
81
|
-
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
82
|
-
else
|
83
|
-
vnic.fqdn = vnic.hostname_label + '.' + subnet.data.subnet_domain_name if
|
84
|
-
subnet.data && subnet.data.subnet_domain_name && vnic.hostname_label
|
85
|
-
vnic.subnet_name = subnet.data.display_name if
|
86
|
-
subnet.data && subnet.data.display_name
|
87
|
-
# piggyback the vcn_id from here, so we can avoid a few network calls
|
88
|
-
vnic.vcn_id = subnet.data.vcn_id
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
26
|
def run
|
93
27
|
validate_required_params(%i[instance_id], config)
|
94
28
|
vnic_array = []
|
@@ -103,10 +37,10 @@ class Chef
|
|
103
37
|
raise unless service_error.service_code == 'NotAuthorizedOrNotFound'
|
104
38
|
else
|
105
39
|
add_vnic_details(vnic_info.data)
|
106
|
-
# for now, only display information for primary vnic
|
107
40
|
if vnic_info.data.is_primary == true
|
41
|
+
vnic_array.unshift(vnic_info.data) # make primary interface first in the array
|
42
|
+
else
|
108
43
|
vnic_array.push(vnic_info.data)
|
109
|
-
break
|
110
44
|
end
|
111
45
|
end
|
112
46
|
end
|
data/lib/knife-oci/version.rb
CHANGED
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-oci
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oracle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oci
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '2.0'
|
20
|
-
- -
|
20
|
+
- - '>='
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 2.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '2.0'
|
30
|
-
- -
|
30
|
+
- - '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 2.0.0
|
33
33
|
description: ''
|
@@ -38,19 +38,20 @@ executables: []
|
|
38
38
|
extensions: []
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
-
|
41
|
+
- ./lib/chef/knife/oci_ad_list.rb
|
42
|
+
- ./lib/chef/knife/oci_common_options.rb
|
43
|
+
- ./lib/chef/knife/oci_compartment_list.rb
|
44
|
+
- ./lib/chef/knife/oci_helper.rb
|
45
|
+
- ./lib/chef/knife/oci_helper_show.rb
|
46
|
+
- ./lib/chef/knife/oci_image_list.rb
|
47
|
+
- ./lib/chef/knife/oci_server_create.rb
|
48
|
+
- ./lib/chef/knife/oci_server_delete.rb
|
49
|
+
- ./lib/chef/knife/oci_server_list.rb
|
50
|
+
- ./lib/chef/knife/oci_server_show.rb
|
51
|
+
- ./lib/chef/knife/oci_shape_list.rb
|
52
|
+
- ./lib/chef/knife/oci_subnet_list.rb
|
53
|
+
- ./lib/chef/knife/oci_vcn_list.rb
|
54
|
+
- ./lib/knife-oci/version.rb
|
54
55
|
- LICENSE.txt
|
55
56
|
homepage: https://github.com/oracle/knife-oci
|
56
57
|
licenses:
|
@@ -63,17 +64,17 @@ require_paths:
|
|
63
64
|
- lib
|
64
65
|
required_ruby_version: !ruby/object:Gem::Requirement
|
65
66
|
requirements:
|
66
|
-
- -
|
67
|
+
- - '>='
|
67
68
|
- !ruby/object:Gem::Version
|
68
69
|
version: 2.2.0
|
69
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
71
|
requirements:
|
71
|
-
- -
|
72
|
+
- - '>='
|
72
73
|
- !ruby/object:Gem::Version
|
73
74
|
version: '0'
|
74
75
|
requirements: []
|
75
76
|
rubyforge_project:
|
76
|
-
rubygems_version: 2.
|
77
|
+
rubygems_version: 2.0.14.1
|
77
78
|
signing_key:
|
78
79
|
specification_version: 4
|
79
80
|
summary: Chef Knife Plugin for Oracle Cloud Infrastructure
|