kakine 0.6.2 → 0.6.4

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: 4ec78de93e19825544107632dd62a67ef4b23455
4
- data.tar.gz: 060b8f4aecb6fa6ae6f2b983d8507a3112349294
3
+ metadata.gz: bf6d5e3e95d3be988ee9de202354581f560e6851
4
+ data.tar.gz: e27e67a5788ff219fec2cdda39d7f15f26dec8bc
5
5
  SHA512:
6
- metadata.gz: b4675c09b6481ffe7203ecdcc06463f17c5a9cc41f252d644fc52aa7c12a305385d89114bdbf483437dcff2ac7851a9977e87be2dac21606b8105a4697c5effa
7
- data.tar.gz: 810936c4848138ac21918cabafe0955ac4920b06da6463e7dfe059c875170d3de41c5235d6879b13be1d2bcc1d8c7ac93808206aecb158c67cc386f092cf1348
6
+ metadata.gz: 5eea18b91ec4aeca9c81b90ddfd1e95152a4a6f8d68a813e1fed0c73f5d470c27df5a814d30deca06f5b2364dcc79a84c8a867cd0575180b0a49158e7f618b44
7
+ data.tar.gz: ff43d0438657fa5bd130f1c987881285ec485ff6af6bb5fe649f4dc2471d7044e8e4f3af7db5a17e214b799a11ac3717d64d187f308bc9b1eb0dad04ea1d960c
@@ -17,6 +17,8 @@ require 'kakine/resource/openstack'
17
17
  require 'kakine/resource/yaml'
18
18
  require 'kakine/security_group'
19
19
  require 'kakine/security_rule'
20
+ require 'kakine/exporter'
21
+ require 'kakine/exporter/terraform'
20
22
 
21
23
  module Kakine
22
24
  class Error < StandardError; end
@@ -17,6 +17,18 @@ module Kakine
17
17
  Kakine::Director.apply
18
18
  end
19
19
 
20
+ option :tenant, type: :string, aliases: "-t"
21
+ option :filename, type: :string, aliases: "-f"
22
+ option :format, type: :string, aliases: '-F'
23
+ option :output, type: :string, aliases: '-o'
24
+ desc 'convert', 'convert Security Groups into other format'
25
+ def convert
26
+ format = options[:format] or fail '--format is required'
27
+ output = options[:output]
28
+ Kakine::Option.set_options(options)
29
+ Kakine::Director.convert(format, output)
30
+ end
31
+
20
32
  no_commands do
21
33
  def setup(options)
22
34
  Kakine::Option.set_options(options)
@@ -18,8 +18,20 @@ module Kakine
18
18
 
19
19
  Kakine::Builder.clean_up_security_group(new_sgs, current_sgs)
20
20
 
21
- rescue Kakine::Error => e
22
- puts "[error] #{e}"
21
+ rescue Kakine::Error => e
22
+ puts "[error] #{e}"
23
+ end
24
+
25
+ def convert(format, output = nil)
26
+ sgs = Kakine::Resource.get(:yaml).load_security_group
27
+
28
+ file = output ? open(output, 'w') : $stdout.dup
29
+ begin
30
+ exporter = Kakine::Exporter.get(format).new(file)
31
+ exporter.export(sgs)
32
+ ensure
33
+ file.close
34
+ end
23
35
  end
24
36
  end
25
37
  end
@@ -0,0 +1,12 @@
1
+ module Kakine
2
+ module Exporter
3
+ def self.get(type)
4
+ case type.to_sym
5
+ when :terraform
6
+ Kakine::Exporter::Terraform
7
+ else
8
+ fail "Unknown exporter: #{type}"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,80 @@
1
+ module Kakine
2
+ module Exporter
3
+ class Terraform
4
+ def initialize(output, pretty: true)
5
+ @output = output
6
+ @pretty = pretty
7
+ end
8
+
9
+ def export(security_groups)
10
+ write(generate(security_groups))
11
+ end
12
+
13
+ private
14
+
15
+ def write(tf)
16
+ @output.write(@pretty ? JSON.pretty_generate(tf) : JSON.generate(tf))
17
+ end
18
+
19
+ def generate(security_groups)
20
+ {
21
+ resource: {
22
+ 'openstack_networking_secgroup_v2' => generate_security_groups(security_groups),
23
+ 'openstack_networking_secgroup_rule_v2' => generate_security_group_rules(security_groups),
24
+ },
25
+ }
26
+ end
27
+
28
+ def generate_security_groups(security_groups)
29
+ security_groups.each.with_object({}) do |security_group, resources|
30
+ resources[sanitize(security_group.name)] = {
31
+ name: security_group.name,
32
+ description: security_group.description,
33
+ }
34
+ end
35
+ end
36
+
37
+ def generate_security_group_rules(security_groups)
38
+ security_groups.each.with_object({}) do |security_group, resources|
39
+ security_group.rules.each do |rule|
40
+ name = [sanitize(security_group.name), sanitize(identify(rule))].join('-')
41
+ resources[name] = compact_hash(
42
+ direction: rule.direction,
43
+ ethertype: rule.ethertype,
44
+ protocol: rule.protocol,
45
+ port_range_min: rule.port_range_min,
46
+ port_range_max: rule.port_range_max,
47
+ remote_ip_prefix: rule.remote_ip,
48
+ remote_group_id: ("${openstack_networking_secgroup_v2.#{sanitize(rule.remote_group)}.id}" if rule.remote_group),
49
+ security_group_id: "${openstack_networking_secgroup_v2.#{sanitize(security_group.name)}.id}",
50
+ )
51
+ end
52
+ end
53
+ end
54
+
55
+ # Generates a unique name for a SG rule.
56
+ def identify(rule)
57
+ [
58
+ rule.direction,
59
+ rule.ethertype,
60
+ rule.protocol,
61
+ rule.port_range_min,
62
+ rule.port_range_max,
63
+ rule.remote_ip,
64
+ rule.remote_group,
65
+ ].compact.map(&method(:sanitize)).join('-')
66
+ end
67
+
68
+ # Returns a string that can be used as a Terraform resource name.
69
+ def sanitize(name)
70
+ name.to_s.gsub(/\W/, '_')
71
+ end
72
+
73
+ def compact_hash(hash)
74
+ return hash.compact if hash.respond_to?(:compact)
75
+ hash.each.with_object({}) {|(k, v), hash| hash[k] = v unless v.nil? }
76
+ end
77
+ end
78
+ end
79
+ end
80
+
@@ -11,7 +11,7 @@ module Kakine
11
11
  data = yaml(filename).reject {|k, _| k.start_with?('_') && k.end_with?('_') }
12
12
  validate_file_input(data)
13
13
  data.each do |name, params|
14
- params['rules'] = perform_expansion(params['rules']) if params['rules']
14
+ params['rules'] = perform_desugar(perform_expansion(params['rules'])) if params['rules']
15
15
  end
16
16
  end
17
17
 
@@ -99,6 +99,20 @@ module Kakine
99
99
 
100
100
  rules
101
101
  end
102
+
103
+ def perform_desugar(rules)
104
+ rules.map do |rule|
105
+ if rule['port'].is_a?(String) && rule['port'] =~ /\A(?<min>\d+)-(?<max>\d+)\z/
106
+ rule.dup.tap do |rule|
107
+ rule.delete('port')
108
+ rule['port_range_min'] = $~[:min].to_i
109
+ rule['port_range_max'] = $~[:max].to_i
110
+ end
111
+ else
112
+ rule
113
+ end
114
+ end
115
+ end
102
116
  end
103
117
  end
104
118
  end
@@ -1,3 +1,3 @@
1
1
  module Kakine
2
- VERSION = "0.6.2"
2
+ VERSION = "0.6.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kakine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - SHIBATA Hiroshi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-13 00:00:00.000000000 Z
11
+ date: 2017-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yao
@@ -121,6 +121,8 @@ files:
121
121
  - lib/kakine/cli.rb
122
122
  - lib/kakine/config.rb
123
123
  - lib/kakine/director.rb
124
+ - lib/kakine/exporter.rb
125
+ - lib/kakine/exporter/terraform.rb
124
126
  - lib/kakine/option.rb
125
127
  - lib/kakine/resource.rb
126
128
  - lib/kakine/resource/openstack.rb
@@ -148,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
150
  version: '0'
149
151
  requirements: []
150
152
  rubyforge_project:
151
- rubygems_version: 2.5.1
153
+ rubygems_version: 2.6.8
152
154
  signing_key:
153
155
  specification_version: 4
154
156
  summary: Security Group configuration tool for OpenStack.