sakurraform 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 88126f4ae6bc4935c5b39fecf16f266a36def3b4
4
+ data.tar.gz: 500102637b8e8c2ab46d66acc0572d35887741d2
5
+ SHA512:
6
+ metadata.gz: eddd0b20f908bd1ddabfc9d19dbde30258ce8df06ae12e54d99d0173c70d3806f3a1190713fe145c4e8cb3e0c6456bd0976bb958be4ab5a39796684c1cd7b0f2
7
+ data.tar.gz: af21a3f41402c7e5dc9deaabe9c527649965155c7187187e80897f7308d395bfebf8513625fbeb5bafb0271dc30fb0a1d31a32c82a8c5972adc6bd8f33943236
data/.gitignore ADDED
@@ -0,0 +1,32 @@
1
+ /.bundle/
2
+ /vendor/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
16
+ # Created by https://www.gitignore.io
17
+
18
+ ### vim ###
19
+ [._]*.s[a-w][a-z]
20
+ [._]s[a-w][a-z]
21
+ *.un~
22
+ Session.vim
23
+ .netrwhist
24
+ *~
25
+
26
+
27
+ ## RVM
28
+ .rvmrc
29
+
30
+ ## SakurraForm
31
+ /.sakuracloud/
32
+ /playground/
data/CHANGELOG.md ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sakurraform.gemspec
4
+ gem 'fog', git: 'https://github.com/fog/fog.git', ref: 'master'
5
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 sawanoboly
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Sakurraform
2
+
3
+ [WIP]
4
+
5
+ Manage Infrastructure from Code with Sakura no Cloud
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'sakurraform'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install sakurraform
22
+
23
+ ## Usage
24
+
25
+ ```
26
+ $ ./bin/sakkuraform
27
+ Commands:
28
+ sakkuraform help [COMMAND] # Describe available commands or one specific command
29
+ sakkuraform init # initiaize .sakuracloud/credentials
30
+ sakkuraform plan SUBCOMMAND #
31
+ sakkuraform status # show status
32
+ sakkuraform version # show version
33
+ ```
34
+
35
+ ### sakurraform init
36
+
37
+ Create credential file
38
+
39
+ ### sakkuraform plan SUBCOMMAND
40
+
41
+ #### sakkuraform plan generate
42
+
43
+ Create plan template.
44
+
45
+ #### sakkuraform plan apply
46
+
47
+ Create resources from yaml.
48
+
49
+
50
+ ## Contributing
51
+
52
+ 1. Fork it ( https://github.com/[my-github-username]/sakurraform/fork )
53
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
54
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
55
+ 4. Push to the branch (`git push origin my-new-feature`)
56
+ 5. Create a new Pull Request
57
+
58
+ ## LICENSE and Author
59
+
60
+ LICENSE: MIT
61
+
62
+ Author: SAWANOBORI Yukihiko(sawanoboriyu@higanworks.com)
63
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/sakkuraform ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ require "thor"
3
+
4
+ lib = File.expand_path('../../lib', __FILE__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+ require 'sakurraform'
7
+ require 'sakurraform/cli'
8
+
9
+ SakurraForm::CLI.start(ARGV)
@@ -0,0 +1,13 @@
1
+ require 'uuid'
2
+ require 'pp'
3
+ require 'json'
4
+ require 'chamber'
5
+ require 'fog'
6
+ require 'formatador'
7
+ require 'ipaddress'
8
+ require "sakurraform/version"
9
+ require "sakurraform/helper"
10
+ require "sakurraform/load_plan"
11
+ require "sakurraform/collections"
12
+ require "sakurraform/resources"
13
+
@@ -0,0 +1,11 @@
1
+ require 'sakurraform/cli/version'
2
+ require 'sakurraform/cli/init'
3
+ require 'sakurraform/cli/plan'
4
+ require 'sakurraform/cli/status'
5
+
6
+ module SakurraForm
7
+ class CLI < Thor
8
+ desc "plan SUBCOMMAND", ''
9
+ subcommand "plan", SakurraForm::Plan
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ require 'thor/group'
2
+
3
+ module SakurraForm
4
+ class CLI < Thor
5
+ include Thor::Actions
6
+
7
+ def self.source_root
8
+ File.expand_path("../../", __FILE__)
9
+ end
10
+
11
+ desc 'init', 'initiaize .sakuracloud/credentials'
12
+ def init
13
+ empty_directory('.sakuracloud')
14
+ @sakuracloud_api_token = ask("Sakuracloud_api_token ? ")
15
+ @sakuracloud_api_token_secret = ask("Sakuracloud_api_token_secret ? ")
16
+ template('templates/credentials.tt', ".sakuracloud/credentials")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,79 @@
1
+ module SakurraForm
2
+ class Plan < Thor
3
+ include Thor::Actions
4
+ include SakurraForm::Helper
5
+
6
+ def self.source_root
7
+ File.expand_path("../../", __FILE__)
8
+ end
9
+
10
+ desc 'generate', ''
11
+ def generate
12
+ empty_directory('state')
13
+ empty_directory('state/network')
14
+ empty_directory('state/server')
15
+ template('templates/network.tt', "plan/network.yml")
16
+ copy_file('templates/server.tt', "plan/server.yml")
17
+ end
18
+
19
+ desc 'apply', ''
20
+ def apply
21
+ ## Prepare Network
22
+ col_networks = SakurraForm::Collection.new('network')
23
+ col_networks.collection_resources
24
+
25
+ network = Fog::Network[:sakuracloud]
26
+ col_networks.resources.each do |net|
27
+ unless net.resource_id
28
+ net.resource_id = name_plus_uuid(net.name)
29
+ options = net.configuration.first.merge({'name' => net.resource_id})
30
+ say("Create new network #{net.name}")
31
+ router = network.routers.create(options)
32
+ switch = network.switches.find {|s| s.id == router.id}
33
+ create_file "state/network/#{net.resource_id}.yml", switch.all_attributes.to_yaml
34
+ else
35
+ say("#{net.name} already available as #{net.resource_id}")
36
+ end
37
+ end
38
+
39
+ col_networks = SakurraForm::Collection.new('network')
40
+ col_networks.collection_resources(true)
41
+
42
+ col_servers = SakurraForm::Collection.new('server')
43
+ col_servers.collection_resources
44
+ compute = Fog::Compute[:sakuracloud]
45
+ volume = Fog::Volume[:sakuracloud]
46
+
47
+ col_servers.resources.each do |sv|
48
+ unless sv.resource_id
49
+ sv.resource_id = name_plus_uuid(sv.name)
50
+ switch_id = resolve_sakura_id_by_combined(sv.configuration.first["switch"])
51
+ options = sv.configuration.first.merge(
52
+ {
53
+ "name" => sv.resource_id,
54
+ "switch" => switch_id
55
+ }
56
+ )
57
+ say("Create new server #{sv.name}")
58
+ server = compute.servers.create(options)
59
+
60
+ sv_network = (col_networks.resources.find {|n| n.cached_state[:id] == switch_id}).cached_state[:subnets].first
61
+ sv_ipaddress = get_offset_address(sv_network["DefaultRoute"], sv.configuration.first["meta"]["network_offset"])
62
+ subnet ={
63
+ :ipaddress => sv_ipaddress,
64
+ :networkmasklen => sv_network["NetworkMaskLen"],
65
+ :defaultroute => sv_network["DefaultRoute"]
66
+ }
67
+
68
+ disk_id = server.disks.first['ID']
69
+ say("Associate #{sv_ipaddress} to #{sv.name}")
70
+ volume.associate_ip_to_disk(disk_id, subnet)
71
+ server.boot
72
+ create_file "state/server/#{sv.resource_id}.yml", server.all_attributes.to_yaml
73
+ else
74
+ say("#{sv.name} already available as #{sv.resource_id}")
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,27 @@
1
+ module SakurraForm
2
+ class CLI < Thor
3
+ include Thor::Actions
4
+ include SakurraForm::Helper
5
+
6
+ def self.source_root
7
+ File.expand_path("../../", __FILE__)
8
+ end
9
+
10
+ desc 'status', "show status"
11
+ def status
12
+ ## Showdown Network
13
+ col_network = SakurraForm::Collection.new('network')
14
+ col_network.collection_resources(true)
15
+ Formatador.display_line('[green]Nework resources[/]')
16
+ Formatador.display_table(build_state_network(col_network), [:name, :sakura_name, :sakura_id, :subnet, :gateway])
17
+ say()
18
+
19
+ ## Showdown Server
20
+ col_server = SakurraForm::Collection.new('server')
21
+ col_server.collection_resources(true)
22
+ Formatador.display_line('[green]Server resources[/]')
23
+ Formatador.display_table(build_state_server(col_server), [:name, :sakura_name, :sakura_id, :ipaddress, :status, :last_state_changed])
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module SakurraForm
2
+ class CLI < Thor
3
+ desc "version", "show version"
4
+ def version
5
+ say SakurraForm::VERSION
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ module SakurraForm
2
+ class Collection
3
+ attr_accessor :type, :resources
4
+ def initialize(type)
5
+ @type = type
6
+ @resources = Array.new
7
+ end
8
+
9
+ def collection_resources(enable_remote = false)
10
+ configuration = SakurraForm::Plans[@type.to_sym]
11
+ configuration.each do |conf|
12
+ @resources << SakurraForm::Resource.const_get(type.capitalize).new(conf[:name], enable_remote)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,82 @@
1
+ module SakurraForm
2
+ module Helper
3
+
4
+ def resolve_id_by_name(type, name)
5
+ files = Dir.glob("state/#{type}/#{name}-????????-????-????-????-????????????.yml")
6
+ return nil if files.empty?
7
+ raise "Abort: Same name detected." if files.size > 1
8
+ File.basename(files.first, '.yml')
9
+ end
10
+
11
+ def resolve_sakura_id_by_resource_id(type, resouce_id)
12
+ state_file = "state/#{type}/#{resouce_id}.yml"
13
+ return nil unless File.exists?(state_file)
14
+ resource = YAML.load(File.read(state_file))
15
+ resource[:id]
16
+ end
17
+
18
+ def resolve_sakura_id_by_name(type, name)
19
+ resouce_id = resolve_id_by_name(type, name)
20
+ return nil unless resouce_id
21
+ resolve_sakura_id_by_resource_id(type, resouce_id)
22
+ end
23
+
24
+ def resolve_sakura_id_by_combined(c_resource)
25
+ type, name = split_combined_resource(c_resource)
26
+ sakura_id = resolve_sakura_id_by_name(type, name)
27
+ raise "Abort: Depend resource #{c_resource} not created." unless sakura_id
28
+ sakura_id
29
+ end
30
+
31
+ def split_combined_resource(c_resource)
32
+ type, name = c_resource.split('[').first, c_resource.match(/\[([\w]+)\]/)[1]
33
+ [ type, name ]
34
+ end
35
+
36
+ def fog_client(service)
37
+ # Pending
38
+ end
39
+
40
+ def name_plus_uuid(name)
41
+ [name, UUID.generate].join('-')
42
+ end
43
+
44
+ def get_offset_address(ip, offset)
45
+ dec_ip = IPAddress(ip).to_i + offset
46
+ IPAddr.new(dec_ip, Socket::AF_INET).to_s
47
+ end
48
+
49
+ def build_state_network(col_network)
50
+ table_data = []
51
+ col_network.resources.each do |resource|
52
+ table_datum = {}
53
+ # pp resource
54
+ table_datum[:name] = resource.name
55
+ table_datum[:sakura_name] = resource.resource_id ? resource.resource_id : 'not created'
56
+ table_datum[:sakura_id] = resource.remote_state ? resource.remote_state[:id] : 'not created'
57
+ table_datum[:subnet] = resource.remote_state ? resource.remote_state[:subnets].first['NetworkAddress'] + '/' + resource.remote_state[:subnets].first['NetworkMaskLen'].to_s : 'not created'
58
+ table_datum[:gateway] = resource.remote_state ? resource.remote_state[:subnets].first['DefaultRoute'] : 'not created'
59
+
60
+ table_data << table_datum
61
+ end
62
+ table_data
63
+ end
64
+
65
+ def build_state_server(col_server)
66
+ table_data = []
67
+ col_server.resources.each do |resource|
68
+ table_datum = {}
69
+ # pp resource
70
+ table_datum[:name] = resource.name
71
+ table_datum[:sakura_name] = resource.resource_id ? resource.resource_id : 'not created'
72
+ table_datum[:sakura_id] = resource.remote_state ? resource.remote_state[:id] : 'not created'
73
+ table_datum[:status] = resource.remote_state ? resource.remote_state[:instance]['Status'] : 'not created'
74
+ table_datum[:last_state_changed] = resource.remote_state ? resource.remote_state[:instance]['StatusChangedAt'] : 'not created'
75
+ table_datum[:ipaddress] = resource.remote_state ? resource.remote_state[:interfaces].first['UserIPAddress'] : 'not created'
76
+
77
+ table_data << table_datum
78
+ end
79
+ table_data
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,2 @@
1
+ SakurraForm::Plans = Chamber.load files: ['plan/network.yml', 'plan/server.yml']
2
+ ENV['FOG_RC'] = '.sakuracloud/credentials'
@@ -0,0 +1,3 @@
1
+ SakurraForm::Plans = Chamber.load files: ['plan/network.yml', 'plan/server.yml']
2
+ ENV['FOG_RC'] = '.sakuracloud/credentials'
3
+
@@ -0,0 +1,28 @@
1
+ module SakurraForm
2
+ class Resource
3
+ class Base
4
+ include SakurraForm::Helper
5
+
6
+ attr_accessor :name, :resource_id, :configuration, :cached_state, :remote_state
7
+ def initialize(name, enable_remote = false)
8
+ type = self.class.to_s.split('::').last.downcase
9
+ @name = name
10
+ @resource_id = resolve_id_by_name(type, name)
11
+ @configuration = SakurraForm::Plans[type.to_sym].select {|a| a.name == name}
12
+ @cached_state = @resource_id ? collect_cached_state(type) : nil
13
+ enable_remote = false unless @cached_state
14
+ @remote_state = enable_remote ? collect_remote_state : nil
15
+ end
16
+
17
+ def collect_cached_state(type)
18
+ state_path = "state/#{type}/#{@resource_id}.yml"
19
+ return {} unless File.exists?(state_path)
20
+ YAML.load(File.read(state_path))
21
+ end
22
+
23
+ def collect_remote_state
24
+ # Override It
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module SakurraForm
2
+ class Resource
3
+ class Network < SakurraForm::Resource::Base
4
+ def collect_remote_state
5
+ return {} unless @resource_id
6
+ network = Fog::Network[:sakuracloud]
7
+ router = network.switches.find {|n| n.name == @resource_id}
8
+ return {} unless router
9
+ router.all_attributes
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module SakurraForm
2
+ class Resource
3
+ class Server < SakurraForm::Resource::Base
4
+ def collect_remote_state
5
+ return {} unless @resource_id
6
+ compute = Fog::Compute[:sakuracloud]
7
+ server = compute.servers.find {|n| n.name == @resource_id}
8
+ return {} unless server
9
+ server.all_attributes
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ require 'sakurraform/resource/base'
2
+ require 'sakurraform/resource/network'
3
+ require 'sakurraform/resource/server'
@@ -0,0 +1,3 @@
1
+ default:
2
+ sakuracloud_api_token: <%= @sakuracloud_api_token %>
3
+ sakuracloud_api_token_secret: <%= @sakuracloud_api_token_secret %>
@@ -0,0 +1,7 @@
1
+ ---
2
+ network:
3
+ - name: defaultrouter
4
+ networkmasklen: 28
5
+ - name: defaultrouter2
6
+ networkmasklen: 28
7
+
@@ -0,0 +1,29 @@
1
+ ---
2
+ server:
3
+ - name: server1
4
+ serverplan: 2001
5
+ sshkey: <%= ENV['SAKURA_SSH_KEYID'] %>
6
+ volume:
7
+ diskplan: 4
8
+ sourcearchive: 112500463685
9
+ switch: network[defaultrouter]
10
+ meta:
11
+ network_offset: 1
12
+ chef_environment: null
13
+ chef_role:
14
+ - aaa
15
+ - bbb
16
+ - name: server2
17
+ serverplan: 2001
18
+ sshkey: <%= ENV['SAKURA_SSH_KEYID'] %>
19
+ volume:
20
+ diskplan: 4
21
+ sourcearchive: 112500463685
22
+ switch: network[defaultrouter]
23
+ meta:
24
+ network_offset: 2
25
+ chef_environment: null
26
+ chef_role:
27
+ - aaa
28
+ - bbb
29
+
@@ -0,0 +1,3 @@
1
+ module SakurraForm
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sakurraform/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sakurraform"
8
+ spec.version = SakurraForm::VERSION
9
+ spec.authors = ["sawanoboly"]
10
+ spec.email = ["sawanoboriyu@higanworks.com"]
11
+ spec.summary = %q{Manage Infrastructure from Code with Sakura no Cloud}
12
+ spec.description = %q{Manage Infrastructure from Code with Sakura no Cloud}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "thor"
22
+ spec.add_dependency "uuid"
23
+ spec.add_dependency "chamber"
24
+ spec.add_dependency "fog-sakuracloud", "~> 0.1.0"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.7"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "pry"
29
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sakurraform
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - sawanoboly
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: uuid
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: chamber
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: fog-sakuracloud
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Manage Infrastructure from Code with Sakura no Cloud
112
+ email:
113
+ - sawanoboriyu@higanworks.com
114
+ executables:
115
+ - sakkuraform
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - CHANGELOG.md
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/sakkuraform
126
+ - lib/sakurraform.rb
127
+ - lib/sakurraform/cli.rb
128
+ - lib/sakurraform/cli/init.rb
129
+ - lib/sakurraform/cli/plan.rb
130
+ - lib/sakurraform/cli/status.rb
131
+ - lib/sakurraform/cli/version.rb
132
+ - lib/sakurraform/collections.rb
133
+ - lib/sakurraform/helper.rb
134
+ - lib/sakurraform/load_plan.rb
135
+ - lib/sakurraform/plans.rb
136
+ - lib/sakurraform/resource/base.rb
137
+ - lib/sakurraform/resource/network.rb
138
+ - lib/sakurraform/resource/server.rb
139
+ - lib/sakurraform/resources.rb
140
+ - lib/sakurraform/templates/credentials.tt
141
+ - lib/sakurraform/templates/network.tt
142
+ - lib/sakurraform/templates/server.tt
143
+ - lib/sakurraform/version.rb
144
+ - sakurraform.gemspec
145
+ homepage: ''
146
+ licenses:
147
+ - MIT
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project:
165
+ rubygems_version: 2.2.2
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Manage Infrastructure from Code with Sakura no Cloud
169
+ test_files: []