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 +7 -0
- data/.gitignore +32 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +63 -0
- data/Rakefile +2 -0
- data/bin/sakkuraform +9 -0
- data/lib/sakurraform.rb +13 -0
- data/lib/sakurraform/cli.rb +11 -0
- data/lib/sakurraform/cli/init.rb +19 -0
- data/lib/sakurraform/cli/plan.rb +79 -0
- data/lib/sakurraform/cli/status.rb +27 -0
- data/lib/sakurraform/cli/version.rb +8 -0
- data/lib/sakurraform/collections.rb +16 -0
- data/lib/sakurraform/helper.rb +82 -0
- data/lib/sakurraform/load_plan.rb +2 -0
- data/lib/sakurraform/plans.rb +3 -0
- data/lib/sakurraform/resource/base.rb +28 -0
- data/lib/sakurraform/resource/network.rb +13 -0
- data/lib/sakurraform/resource/server.rb +13 -0
- data/lib/sakurraform/resources.rb +3 -0
- data/lib/sakurraform/templates/credentials.tt +3 -0
- data/lib/sakurraform/templates/network.tt +7 -0
- data/lib/sakurraform/templates/server.tt +29 -0
- data/lib/sakurraform/version.rb +3 -0
- data/sakurraform.gemspec +29 -0
- metadata +169 -0
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
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
data/bin/sakkuraform
ADDED
data/lib/sakurraform.rb
ADDED
@@ -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,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,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,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,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
|
+
|
data/sakurraform.gemspec
ADDED
@@ -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: []
|