kitchen-oci 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 28a500ab2c3ac91b3fc827a78bfcb8c50cf1f1a2
4
+ data.tar.gz: 97a476e7eeb9d8fb1c9fcc43ddbe9471b88915f3
5
+ SHA512:
6
+ metadata.gz: 6cbb83bc027ff4d4f66f5a48184749b7bdd08342a2a42adc3ca6e87f084501f7c1101011aa76310630eaee53c4fb7c0d2a2021bb8ec669dcac8e0483c2334278
7
+ data.tar.gz: dfc1c9221d4d5f93af40d28805472c420cdadd81cfd6c6fb8412ec06edb067f6e34f65f1309c6f099bb7cfe72bd0451bc293e93ea2f90de9f28108138fefff90
data/.cane ADDED
File without changes
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .kitchen
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - 1.9.2
7
+ - ruby-head
8
+
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: ruby-head
@@ -0,0 +1,3 @@
1
+ ## 0.1.0 / Unreleased
2
+
3
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Author:: Stephen Pearson (<stevieweavie@gmail.com>)
2
+
3
+ Copyright (C) 2017, Stephen Pearson
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
@@ -0,0 +1,89 @@
1
+ # Kitchen::OCI
2
+
3
+ A Test Kitchen Driver for Oracle Bare Metal Cloud
4
+
5
+ WARNING: This is alpha quality. Use at your own risk!
6
+
7
+ ## Prerequisites
8
+
9
+ You need an ssh keypair defined for your current user. By default the driver
10
+ expects to find the public key in ~/.ssh/id_rsa.pub, but this can be
11
+ overridden in .kitchen.yml.
12
+
13
+ You need to create suitable configuration for OCI in ~/.oci/config but this
14
+ can be created using the CLI:
15
+ ```
16
+ oci setup config
17
+ ```
18
+
19
+ Ensure that you have a suitable compartment defined, an external subnet, and
20
+ security rules that allow incoming SSH and outgoing HTTP (to allow Kitchen to
21
+ pull the Chef binaries).
22
+
23
+ ## Building the gem
24
+
25
+ Ensure you have the ChefDK installed.
26
+
27
+ ```
28
+ eval "$(chef shell-init bash)"
29
+ rake build
30
+ gem install pkg/kitchen-oci-<VERSION>.gem
31
+ ```
32
+
33
+ ## Example .kitchen.yml
34
+
35
+ Adjust below template as required. The following configuration is mandatory:
36
+
37
+ - compartment\_id
38
+ - availability\_domain
39
+ - image\_id
40
+ - shape
41
+ - subnet\_id
42
+
43
+ These settings are optional:
44
+
45
+ - oci\_config\_file, by default this is ~/.oci/config
46
+ - oci\_profile\_name, default value is "DEFAULT"
47
+ - ssh\_keypath, default is ~/.ssh/id\_rsa.pub
48
+ - post\_create\_script, does not run a script by default
49
+
50
+ ```
51
+ ---
52
+ driver:
53
+ name: oci
54
+
55
+ provisioner:
56
+ name: chef_zero
57
+ always_update_cookbooks: true
58
+
59
+ verifier:
60
+ name: inspec
61
+
62
+ platforms:
63
+ - name: ubuntu-16.04
64
+ driver:
65
+ availability_domain: "ad1"
66
+ compartment_id: "ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
67
+ image_id: "ocid1.image.oc1.phx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
68
+ shape: "VM.Standard1.2"
69
+ subnet_id: "ocid1.subnet.oc1.phx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
70
+ post_create_script: >-
71
+ touch /tmp/example.txt;
72
+ transport:
73
+ username: "opc"
74
+
75
+ suites:
76
+ - name: default
77
+ run_list:
78
+ - recipe[my_cookbook::default]
79
+ verifier:
80
+ inspec_tests:
81
+ - test/smoke/default
82
+ attributes:
83
+ ```
84
+
85
+ Created and maintained by [Stephen Pearson][author] (<stevieweavie@gmail.com>)
86
+
87
+ ## License
88
+
89
+ Apache 2.0
@@ -0,0 +1,21 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'cane/rake_task'
3
+ require 'tailor/rake_task'
4
+
5
+ desc 'Run cane to check quality metrics'
6
+ Cane::RakeTask.new do |cane|
7
+ cane.canefile = './.cane'
8
+ end
9
+
10
+ Tailor::RakeTask.new
11
+
12
+ desc 'Display LOC stats'
13
+ task :stats do
14
+ puts '\n## Production Code Stats'
15
+ sh 'countloc -r lib'
16
+ end
17
+
18
+ desc 'Run all quality tasks'
19
+ task quality: %i[cane tailor stats]
20
+
21
+ task default: %i[quality]
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'kitchen/driver/oci_version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'kitchen-oci'
7
+ spec.version = Kitchen::Driver::OCI_VERSION
8
+ spec.authors = ['Stephen Pearson']
9
+ spec.email = ['stevieweavie@gmail.com']
10
+ spec.description = 'A Test Kitchen Driver for Oracle OCI'
11
+ spec.summary = spec.description
12
+ spec.homepage = ''
13
+ spec.license = 'Apache-2.0'
14
+
15
+ # rubocop:disable SpecialGlobalVars
16
+ spec.files = `git ls-files`.split($/)
17
+ # rubocop:enable SpecialGlobalVars
18
+ spec.executables = []
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'oci', '~> 2.0'
23
+ spec.add_dependency 'test-kitchen'
24
+
25
+ spec.add_development_dependency 'bundler'
26
+ spec.add_development_dependency 'cane'
27
+ spec.add_development_dependency 'countloc'
28
+ spec.add_development_dependency 'rake'
29
+ end
@@ -0,0 +1,146 @@
1
+ #
2
+ # Author:: Stephen Pearson (<stevieweavie@gmail.com>)
3
+ #
4
+ # Copyright (C) 2017, Stephen Pearson
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'kitchen'
19
+ require 'oci'
20
+
21
+ module Kitchen
22
+ module Driver
23
+ # Oracle OCI driver for Kitchen.
24
+ #
25
+ # @author Stephen Pearson <stevieweavie@gmail.com>
26
+ class Oci < Kitchen::Driver::Base
27
+ required_config :compartment_id
28
+ required_config :availability_domain
29
+ required_config :image_id
30
+ required_config :shape
31
+ required_config :subnet_id
32
+
33
+ default_config :oci_config_file, nil
34
+ default_config :oci_profile_name, nil
35
+ default_keypath = File.expand_path(File.join(%w[~ .ssh id_rsa.pub]))
36
+ default_config :ssh_keypath, default_keypath
37
+ default_config :post_create_script, nil
38
+
39
+ def create(state) # rubocop:disable Metrics/AbcSize
40
+ return if state[:server_id]
41
+
42
+ instance_id = launch_instance(config)
43
+ state[:server_id] = instance_id
44
+ state[:hostname] = public_ip(config, instance_id)
45
+
46
+ instance.transport.connection(state).wait_until_ready
47
+
48
+ return unless config[:post_create_script]
49
+
50
+ info('Running post create script')
51
+ script = config[:post_create_script]
52
+ instance.transport.connection(state).execute(script)
53
+ end
54
+
55
+ def destroy(state)
56
+ return unless state[:server_id]
57
+
58
+ instance.transport.connection(state).close
59
+ comp_api(config).terminate_instance(state[:server_id])
60
+
61
+ state.delete(:server_id)
62
+ state.delete(:hostname)
63
+ end
64
+
65
+ private
66
+
67
+ def oci_config(config)
68
+ params = [:load_config]
69
+ opts = {}
70
+ if config[:oci_config_file]
71
+ opts[:config_file_location] = config[:oci_config_file]
72
+ end
73
+ if config[:oci_profile_name]
74
+ opts[:profile_name] = config[:oci_profile_name]
75
+ end
76
+ params << opts
77
+ OCI::ConfigFileLoader.send(*params)
78
+ end
79
+
80
+ def comp_api(config)
81
+ OCI::Core::ComputeClient.new(config: oci_config(config))
82
+ end
83
+
84
+ def net_api(config)
85
+ OCI::Core::VirtualNetworkClient.new(config: oci_config(config))
86
+ end
87
+
88
+ def launch_instance(config)
89
+ request = compute_instance_request(config)
90
+
91
+ response = comp_api(config).launch_instance(request)
92
+ instance_id = response.data.id
93
+ comp_api(config).get_instance(instance_id).wait_until(
94
+ :lifecycle_state,
95
+ OCI::Core::Models::Instance::LIFECYCLE_STATE_RUNNING
96
+ )
97
+ instance_id
98
+ end
99
+
100
+ def public_ip(config, instance_id)
101
+ vnics = comp_api(config).list_vnic_attachments(
102
+ config[:compartment_id],
103
+ instance_id: instance_id
104
+ )
105
+ vnic_id = vnics.data.first.vnic_id
106
+ net_api(config).get_vnic(vnic_id).data.public_ip
107
+ end
108
+
109
+ def pubkey(config)
110
+ File.readlines(config[:ssh_keypath]).first.chomp
111
+ end
112
+
113
+ def instance_source_details(config)
114
+ OCI::Core::Models::InstanceSourceViaImageDetails.new(
115
+ source_type: 'image',
116
+ imageId: config[:image_id]
117
+ )
118
+ end
119
+
120
+ def create_vnic_details(config)
121
+ OCI::Core::Models::CreateVnicDetails.new(
122
+ assign_public_ip: true,
123
+ display_name: 'primary_nic',
124
+ subnetId: config[:subnet_id]
125
+ )
126
+ end
127
+
128
+ def compute_instance_request(config)
129
+ request = OCI::Core::Models::LaunchInstanceDetails.new
130
+ request.availability_domain = config[:availability_domain]
131
+ request.compartment_id = config[:compartment_id]
132
+ request.display_name = random_hostname(instance.name)
133
+ request.source_details = instance_source_details(config)
134
+ request.shape = config[:shape]
135
+ request.create_vnic_details = create_vnic_details(config)
136
+ request.metadata = { 'ssh_authorized_keys' => pubkey(config) }
137
+ request
138
+ end
139
+
140
+ def random_hostname(prefix)
141
+ randstr = Array.new(6) { ('a'..'z').to_a.sample }.join
142
+ "#{prefix}-#{randstr}"
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,23 @@
1
+ #
2
+ # Author:: Stephen Pearson (<stevieweavie@gmail.com>)
3
+ #
4
+ # Copyright (C) 2017, Stephen Pearson
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Kitchen
19
+ module Driver
20
+ # Version string for Oracle OCI Kitchen driver
21
+ OCI_VERSION = '1.0.0'.freeze
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-oci
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Stephen Pearson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: oci
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
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: test-kitchen
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: cane
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: countloc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: A Test Kitchen Driver for Oracle OCI
98
+ email:
99
+ - stevieweavie@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".cane"
105
+ - ".gitignore"
106
+ - ".travis.yml"
107
+ - CHANGELOG.md
108
+ - Gemfile
109
+ - LICENSE
110
+ - README.md
111
+ - Rakefile
112
+ - kitchen-oci.gemspec
113
+ - lib/kitchen/driver/oci.rb
114
+ - lib/kitchen/driver/oci_version.rb
115
+ homepage: ''
116
+ licenses:
117
+ - Apache-2.0
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.6.13
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: A Test Kitchen Driver for Oracle OCI
139
+ test_files: []