pec 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2605a0a503984011df0eab8a874008286bb01ad9
4
- data.tar.gz: 3669c9b826b620cf233fb3e66d8a268010800f96
3
+ metadata.gz: bf28083dd8187e302dd251c338c800cefaffe4d9
4
+ data.tar.gz: bbb7ff389e5c5be0a97f8afbeb203681e26f6bd7
5
5
  SHA512:
6
- metadata.gz: 1de8c4f81632853c43075b064bb6a385b9039672c2c0a2ba801fc7046212fad1ed43eb882a456f4d29418415a8cd1ad53c53013f2e7fff866ac88abaf9a0e334
7
- data.tar.gz: 6d7a8b1e4ab630e61e3032eb2cf0748610ff9dcf2fc83d9fbf1b8e0d63c55544762e41f0b64ee4bd2982f25bd6c2f81024de5b2f578e88e8d8a8061cabc6a925
6
+ metadata.gz: 662c961455e89a1f2869f9e678c522806d2751866908f26b5efc154d214ee7ab957276697dee475fe5a90c791428c79be81c6628002da09f9ab4a0a9206a6b99
7
+ data.tar.gz: 52ae51ea07c15324bb20ec7fa4e428941464feda24ceb740442fd18fd182ea25a881270b8f78bbe645cb1abcc8ea1ba8cc6a83d1e28e6a457ff8b8e98eae997d
data/README.md CHANGED
@@ -39,7 +39,8 @@ pyama-test001:
39
39
  networks:
40
40
  eth0:
41
41
  bootproto: static
42
- allowed_address_pairs: 10.1.1.5/24
42
+ allowed_address_pairs:
43
+ - 10.1.1.5/24
43
44
  ip_address: 10.1.1.1/24
44
45
  gateway: 10.1.1.254
45
46
  dns1: 8.8.8.8
@@ -83,7 +84,7 @@ pyama-test002:
83
84
  | bootproto | ○ | static or dhcp |
84
85
  | ip_address | ※ | 10.1.1.1/24 |
85
86
  | path | | default:/etc/sysconfig/network-scripts/ifcfg-[device_name] |
86
- | allowed_address_pairs | | 10.1.1.2/24 |
87
+ | allowed_address_pairs | | [10.1.1.2/24] |
87
88
 
88
89
  ※ bootproto=static is required
89
90
  Items other than the above are output to the configuration file with `KEY = value` format
data/lib/pec.rb CHANGED
@@ -1,35 +1,28 @@
1
- require 'fog'
1
+ require 'pp'
2
+ require 'base64'
3
+ require 'yao'
4
+ require 'yaml'
5
+ require 'thor'
2
6
  require 'ip'
3
7
  require 'colorator'
4
8
  require "pec/version"
5
9
  require "pec/logger"
6
10
  require "pec/configure"
7
- require "pec/director"
8
11
  require "pec/handler"
9
12
  require "pec/sample"
10
13
  require "pec/init"
11
14
  require "pec/cli"
12
15
 
16
+
13
17
  module Pec
14
- def self.compute
15
- @_compute ||= Fog::Compute.new({
16
- provider: 'openstack'
17
- })
18
- @_compute
19
- end
20
-
21
- def self.neutron
22
- @_neutron ||= Fog::Network.new({
23
- provider: 'openstack'
24
- })
25
- @_neutron
26
- end
27
-
28
- def self.identity
29
- @_identity ||= Fog::Identity.new({
30
- provider: 'openstack'
31
- })
32
- @_identity
18
+ def self.init_yao(_tenant_name=nil)
19
+ check_env
20
+ Yao.configure do
21
+ auth_url "#{ENV["OS_AUTH_URL"]}/tokens"
22
+ username ENV["OS_USERNAME"]
23
+ password ENV["OS_PASSWORD"]
24
+ tenant_name _tenant_name || ENV["OS_TENANT_NAME"]
25
+ end
33
26
  end
34
27
 
35
28
  def self.load_config(file_name=nil)
@@ -44,10 +37,20 @@ module Pec
44
37
  load_config unless @_configure
45
38
  @_configure
46
39
  end
40
+
41
+ def self.check_env
42
+ %w(
43
+ OS_AUTH_URL
44
+ OS_USERNAME
45
+ OS_PASSWORD
46
+ ).each do |name|
47
+ raise "please set env #{name}" unless ENV[name]
48
+ end
49
+ end
50
+
47
51
  end
48
52
 
49
53
  class ::Hash
50
-
51
54
  def deep_merge(second)
52
55
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
53
56
  self.merge(second.to_h, &merger)
@@ -57,3 +60,4 @@ class ::Hash
57
60
  self.merge!(deep_merge(second))
58
61
  end
59
62
  end
63
+
data/lib/pec/cli.rb CHANGED
@@ -1,30 +1,105 @@
1
1
  require 'pec'
2
- require 'thor'
3
2
  module Pec
4
3
  class CLI < Thor
5
4
 
6
5
  desc 'init', 'create sample config'
7
6
  def init
8
- Pec::Init.create_fog_config
7
+ Pec::Init.show_env_setting
9
8
  Pec::Init.create_template_dir
10
9
  Pec::Init.create_sample_config
11
10
  end
12
11
 
13
12
  desc 'up', 'create vm by Pec.yaml'
14
13
  def up(host_name = nil)
15
- Pec::Director.make(host_name)
14
+ Pec.configure.each do |host|
15
+ next if host_name && host.name != host_name
16
+ Pec.init_yao(host.tenant)
17
+
18
+ server = Yao::Server.list_detail.find {|s|s.name == host.name}
19
+ if server
20
+ Pec::Logger.notice "already exists: #{host.name}"
21
+ next
22
+ end
23
+ Pec::Logger.info "make start #{host.name}"
24
+
25
+ attribute = { name: host.name}
26
+ host.keys.each do |k|
27
+ Pec::Handler.constants.each do |c|
28
+ if Object.const_get("Pec::Handler::#{c}").kind == k
29
+ attribute.deep_merge!(Object.const_get("Pec::Handler::#{c}").build(host))
30
+ end
31
+ end
32
+ end
33
+ p 1
34
+ attribute[:user_data] = Base64.encode64("#cloud-config\n" + attribute[:user_data].to_yaml) if attribute[:user_data]
35
+
36
+ Yao::Server.create(attribute)
37
+ Pec::Logger.info "create success! #{host.name}"
38
+ end
39
+ rescue => e
40
+ print_exception(e)
16
41
  end
17
42
 
18
43
  option :force , type: :boolean, aliases: "-f"
19
44
  desc "destroy", "delete vm"
20
45
  def destroy(host_name = nil)
21
- Pec::Director.destroy(host_name, options)
46
+ Pec.configure.each do |host|
47
+ next if host_name && host.name != host_name
48
+ Pec.init_yao(host.tenant)
49
+
50
+ server = Yao::Server.list_detail.find {|s|s.name == host.name}
51
+ unless server
52
+ Pec::Logger.notice "not be created #{host.name}"
53
+ next
54
+ end
55
+
56
+ if options[:force] || yes?("#{host.name}: Are you sure you want to destroy the '#{host.name}' VM? [y/N]")
57
+ Yao::Server.destroy(server.id)
58
+ Pec::Logger.info "#{host.name} is deleted!"
59
+ end
60
+ end
61
+
62
+ rescue => e
63
+ print_exception(e)
22
64
  end
23
65
 
24
66
  desc "status", "vm status"
25
67
  def status(host_name = nil)
26
68
  say("Current machine stasus:", :yellow)
27
- Pec::Director.status(host_name)
69
+ Pec.configure.each do |host|
70
+ next if host_name && host.name != host_name
71
+ Pec.init_yao(host.tenant)
72
+ if server = Yao::Server.list_detail.find {|s|s.name == host.name}
73
+ puts sprintf(" %-35s %-10s %-10s %-10s %-10s %-35s %-48s",
74
+ host.name,
75
+ server.status,
76
+ Yao::Tenant.list.find {|tenant| tenant.id == server.tenant_id}.name,
77
+ Yao::Flavor.get(server.flavor['id']).name,
78
+ server.availability_zone,
79
+ server.ext_srv_attr_host,
80
+ server.addresses.map do |ethers|
81
+ ethers[1].map do |ether|
82
+ ether["addr"]
83
+ end
84
+ end.flatten.join(",")
85
+ )
86
+ else
87
+ puts sprintf(" %-35s %-10s",
88
+ host.name,
89
+ "uncreated"
90
+ )
91
+ end
92
+ end
93
+
94
+ rescue => e
95
+ print_exception(e)
96
+ end
97
+ no_commands do
98
+
99
+ def print_exception(e)
100
+ Pec::Logger.critical(e)
101
+ Pec::Logger.info("\t" + e.backtrace.join("\n\t"))
102
+ end
28
103
  end
29
104
  end
30
105
  end
data/lib/pec/configure.rb CHANGED
@@ -19,7 +19,7 @@ module Pec
19
19
 
20
20
  def validate(host)
21
21
  %w(
22
- tenant
22
+ tenant
23
23
  image
24
24
  flavor
25
25
  networks
@@ -2,14 +2,8 @@ module Pec::Handler
2
2
  class Base
3
3
  class << self
4
4
  attr_accessor :kind
5
-
6
- %w(image flavor).each do |name|
7
- define_method("fetch_#{name}", -> (host) {
8
- unless resource = Pec.compute.send("#{name}s").find {|val|val.name == host.send(name)}
9
- raise "not fond #{name} #{host.send(name)}"
10
- end
11
- resource
12
- })
5
+ def build
6
+ raise "not defined method"
13
7
  end
14
8
  end
15
9
  end
@@ -5,7 +5,7 @@ module Pec::Handler
5
5
  def self.build(host)
6
6
  Pec::Logger.notice "flavor is #{host.flavor}"
7
7
  {
8
- flavor_ref: fetch_flavor(host).id,
8
+ flavorRef: Yao::Flavor.list.find {|flavor| flavor.name == host.flavor}.id
9
9
  }
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ module Pec::Handler
5
5
  def self.build(host)
6
6
  Pec::Logger.notice "image is #{host.image}"
7
7
  {
8
- image_ref: fetch_image(host).id
8
+ imageRef: Yao::Image.list.find {|image| image.name == host.image}.id
9
9
  }
10
10
  end
11
11
  end
@@ -1,10 +1,10 @@
1
1
  module Pec::Handler
2
- class Networks < Base
2
+ class Networks < Base
3
3
  self.kind = 'networks'
4
4
  autoload :OptionBase, "pec/handler/networks/option_base"
5
5
  autoload :IpAddress, "pec/handler/networks/ip_address"
6
6
  autoload :AllowedAddressPairs, "pec/handler/networks/allowed_address_pairs"
7
-
7
+
8
8
  class << self
9
9
  NAME = 0
10
10
  CONFIG = 1
@@ -22,7 +22,7 @@ module Pec::Handler
22
22
  user_data << gen_user_data(network, port)
23
23
  end
24
24
  {
25
- nics: ports.map {|port| { port_id: port.id }},
25
+ networks: ports.map {|port| { uuid: nil, port: port.id }},
26
26
  user_data: {
27
27
  'write_files' => user_data
28
28
  }
@@ -40,17 +40,17 @@ module Pec::Handler
40
40
 
41
41
  def create_port(host, network)
42
42
  attribute = gen_port_attribute(host, network)
43
- Pec.neutron.ports.create(attribute)
43
+ Yao::Port.create(attribute)
44
44
  end
45
-
45
+
46
46
  def gen_port_attribute(host, network)
47
47
  ip = IP.new(network[CONFIG]['ip_address'])
48
- subnet = Pec.neutron.subnets.find {|s|s.cidr == ip.network.to_s}
48
+ subnet = Yao::Subnet.list.find {|s|s.cidr == ip.network.to_s}
49
49
  attribute = {
50
50
  name: network[NAME],
51
51
  network_id: subnet.network_id
52
52
  }
53
-
53
+
54
54
  attribute.merge!(
55
55
  security_group(host)
56
56
  ) if host.security_group
@@ -66,7 +66,7 @@ module Pec::Handler
66
66
 
67
67
  attribute
68
68
  end
69
-
69
+
70
70
  def gen_user_data(network, port)
71
71
  path = network[CONFIG]['path'] || "/etc/sysconfig/network-scripts/ifcfg-#{port.name}"
72
72
  {
@@ -76,7 +76,7 @@ module Pec::Handler
76
76
  'permissions' => "0644"
77
77
  }
78
78
  end
79
-
79
+
80
80
  def ifcfg_config(network, port)
81
81
  base = {
82
82
  "name" => port.name,
@@ -95,7 +95,7 @@ module Pec::Handler
95
95
  # delete option column
96
96
  Pec::Handler::Networks.constants.each do |c|
97
97
  network[CONFIG].delete(Object.const_get("Pec::Handler::Networks::#{c}").kind)
98
- end
98
+ end
99
99
 
100
100
  base.merge!(
101
101
  network[CONFIG]
@@ -105,7 +105,9 @@ module Pec::Handler
105
105
 
106
106
  def security_group(host)
107
107
  ids = host.security_group.map do |name|
108
- Pec.neutron.security_groups.find {|sg| sg.name == name}.id
108
+ sg = Yao::SecurityGroup.list.find {|sg| sg.name == name}
109
+ raise "security group #{name} is not found" unless sg
110
+ sg.id
109
111
  end
110
112
  { security_groups: ids }
111
113
  end
@@ -6,7 +6,7 @@ module Pec::Handler
6
6
  def build(network)
7
7
  if network[1]['allowed_address_pairs']
8
8
  pairs = network[1]['allowed_address_pairs'].map do |pair|
9
- { ip_address: pair['ip_address'] }
9
+ { ip_address: pair }
10
10
  end
11
11
  { allowed_address_pairs: pairs }
12
12
  end
@@ -5,10 +5,10 @@ module Pec::Handler
5
5
  class << self
6
6
  def build(network)
7
7
  ip = IP.new(network[1]['ip_address'])
8
- subnet = Pec.neutron.subnets.find {|s|s.cidr == ip.network.to_s}
8
+ subnet = Yao::Subnet.list.find {|s|s.cidr == ip.network.to_s}
9
9
 
10
10
  if ip.to_s != subnet.cidr
11
- {
11
+ {
12
12
  fixed_ips: [
13
13
  { subnet_id: subnet.id, ip_address: ip.to_addr}
14
14
  ]
data/lib/pec/init.rb CHANGED
@@ -21,21 +21,12 @@ module Pec
21
21
  end
22
22
  end
23
23
 
24
- def create_fog_config
25
- thor = Thor.new
26
- if !File.exist?(File.expand_path("~/.fog")) || thor.yes?("Do you want to overwrite the existing ~/.fog? [y/N]")
27
- thor.say("Start Configure by OpenStack", :yellow)
28
- params = {}
29
-
30
- params = %w(auth_url username api_key tenant).inject({}) do |user_input, c|
31
- user_input["openstack_#{c}"] = thor.ask("openstack #{c}:")
32
- user_input
33
- end
34
-
35
- thor.say("Configure Complete!", :blue) if open(File.expand_path("~/.fog"), "w") do |e|
36
- YAML.dump({ "default" => params }, e)
37
- end
38
- end
24
+ def show_env_setting
25
+ thor = Thor.new
26
+ thor.say("please set env this paramater", :yellow)
27
+ puts " export OS_AUTH_URL=http://your_keystone_server:port/v2.0"
28
+ puts " export OS_USERNAME=your name"
29
+ puts " export OS_PASSWORD=your password"
39
30
  end
40
31
  end
41
32
  end
data/lib/pec/sample.rb CHANGED
@@ -8,10 +8,12 @@ module Pec
8
8
  "tenant" => "your_tenant",
9
9
  "image" => "centos-7",
10
10
  "flavor" => "m1.small",
11
+ "allowed_address_pairs" => "nova",
11
12
  "networks" => {
12
13
  "eth0" => {
13
14
  "bootproto" => "static",
14
15
  "ip_address" => "10.0.0.0/24",
16
+ "allowed_address_pairs" => ["10.0.0.1"],
15
17
  "gateway" => "10.0.0.254",
16
18
  "dns1" => "10.0.0.10"
17
19
  },
@@ -24,7 +26,7 @@ module Pec
24
26
  },
25
27
  "security_group" => [
26
28
  "default",
27
- "www from any"
29
+ "www_from_any"
28
30
  ],
29
31
  "templates" => [
30
32
  "web_server.yaml"
@@ -36,6 +38,7 @@ module Pec
36
38
  }
37
39
  }
38
40
  end
41
+
39
42
  def user_data
40
43
  {
41
44
  "hostname" => "pec",
data/lib/pec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pec
2
- VERSION = "0.5.2"
2
+ VERSION = "0.6.0"
3
3
  end
data/pec.gemspec CHANGED
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
  spec.add_dependency 'thor', '~> 0.19.1'
21
- spec.add_dependency 'fog', '>= 1.34.0'
21
+ spec.add_dependency 'yao', '>= 0.0.2'
22
22
  spec.add_dependency 'ruby-ip', '~> 0.9.3'
23
- spec.add_dependency 'activesupport', '~> 4.2.1'
24
23
  spec.add_dependency 'colorator', '~> 0.1'
25
24
  spec.add_development_dependency "bundler"
26
25
  spec.add_development_dependency "rspec"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kazuhiko yamashita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-05 00:00:00.000000000 Z
11
+ date: 2015-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.19.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: fog
28
+ name: yao
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.34.0
33
+ version: 0.0.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.34.0
40
+ version: 0.0.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ruby-ip
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.9.3
55
- - !ruby/object:Gem::Dependency
56
- name: activesupport
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 4.2.1
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 4.2.1
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: colorator
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -145,7 +131,6 @@ files:
145
131
  - lib/pec.rb
146
132
  - lib/pec/cli.rb
147
133
  - lib/pec/configure.rb
148
- - lib/pec/director.rb
149
134
  - lib/pec/handler.rb
150
135
  - lib/pec/handler/availability_zone.rb
151
136
  - lib/pec/handler/base.rb
@@ -182,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
167
  version: '0'
183
168
  requirements: []
184
169
  rubyforge_project:
185
- rubygems_version: 2.4.6
170
+ rubygems_version: 2.2.2
186
171
  signing_key:
187
172
  specification_version: 4
188
173
  summary: openstack vm booter.
data/lib/pec/director.rb DELETED
@@ -1,111 +0,0 @@
1
- module Pec
2
- class Director
3
- def self.make(host_name)
4
- Pec.configure.each do |host|
5
- next if host_name && host.name != host_name
6
- Pec::Logger.info "make start #{host.name}"
7
- Pec.compute.set_tenant(host.tenant)
8
- Pec.neutron.set_tenant_patch(host.tenant)
9
-
10
- attribute = { name: host.name}
11
- host.keys.each do |k|
12
- Pec::Handler.constants.each do |c|
13
- if Object.const_get("Pec::Handler::#{c}").kind == k
14
- attribute.deep_merge!(Object.const_get("Pec::Handler::#{c}").build(host))
15
- end
16
- end
17
- end
18
-
19
- attribute[:user_data] = "#cloud-config\n" + attribute[:user_data].to_yaml if attribute[:user_data]
20
- Pec::Logger.info "create success! #{host.name}" if Pec.compute.servers.create(attribute)
21
- end
22
-
23
- rescue Excon::Errors::Error => e
24
- excon_err_message(e)
25
- rescue => e
26
- Pec::Logger.critical(e)
27
- end
28
-
29
- def self.destroy(host_name, options)
30
- Pec.configure.each do |host|
31
- next if host_name && host.name != host_name
32
- Pec.compute.set_tenant(host.tenant)
33
-
34
- server = Pec.compute.servers.find {|s|s.name == host.name}
35
- unless server
36
- Pec::Logger.notice "not be created #{host.name}"
37
- next
38
- end
39
-
40
- if options[:force] || Thor.new.yes?("#{host.name}: Are you sure you want to destroy the '#{host.name}' VM? [y/N]")
41
- Pec::Logger.info "#{host.name} is deleted!" if Pec.compute.servers.destroy(server.id)
42
- end
43
- end
44
-
45
- rescue Excon::Errors::Error => e
46
- excon_err_message(e)
47
- rescue => e
48
- Pec::Logger.critical(e)
49
- end
50
-
51
- def self.status(host_name)
52
- Pec.configure.each do |host|
53
- next if host_name && host.name != host_name
54
- if server = Pec.compute.servers.find {|s|s.name == host.name}
55
- puts sprintf(" %-35s %-10s %-10s %-10s %-10s %-35s %-48s",
56
- host.name,
57
- server.state,
58
- Pec.identity.tenants.find_by_id(server.tenant_id),
59
- Pec.compute.flavors.get(server.flavor['id']).name,
60
- server.availability_zone,
61
- server.os_ext_srv_attr_host,
62
- server.addresses.map do |ethers|
63
- ethers[1].map do |ether|
64
- ether["addr"]
65
- end
66
- end.flatten.join(",")
67
- )
68
- else
69
- puts sprintf(" %-35s %-10s",
70
- host.name,
71
- "uncreated"
72
- )
73
- end
74
- end
75
-
76
- rescue Excon::Errors::Error => e
77
- excon_err_message(e)
78
- rescue => e
79
- Pec::Logger.critical(e)
80
- end
81
-
82
- def self.excon_err_message(e)
83
- if e.response
84
- JSON.parse(e.response[:body]).each { |e,m| Pec::Logger.critical("#{e}:#{m["message"]}") }
85
- else
86
- Pec::Logger.critical(e)
87
- end
88
- end
89
- end
90
- end
91
-
92
- module Fog
93
- module Network
94
- class OpenStack
95
- class Real
96
- def set_tenant_patch(tenant)
97
- @openstack_must_reauthenticate = true
98
- @openstack_tenant = tenant.to_s
99
- authenticate
100
- @path.sub!(/\/$/, '')
101
- unless @path.match(SUPPORTED_VERSIONS)
102
- @path = "/" + Fog::OpenStack.get_supported_version(SUPPORTED_VERSIONS,
103
- @openstack_management_uri,
104
- @auth_token,
105
- @connection_options)
106
- end
107
- end
108
- end
109
- end
110
- end
111
- end