gclouder 0.1.7 → 0.1.8

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: c883949702bd5ebf5955dd329f1270ab98029010
4
- data.tar.gz: aa2a1d13fb78f58ce04db2e2065a1c54319741c7
3
+ metadata.gz: f7311a9316efc730260a93a0b835151265579e08
4
+ data.tar.gz: eda71d3ca4b1001f2ef5bd1e0e7f913f66b7d99c
5
5
  SHA512:
6
- metadata.gz: 2587dbcdb61c10507a2bd0613f13cce975752734acce1c72c046148bf2ae1b995ec04a211a32479f3cc02a0f1b485addf665a4096f8387e198ecd0b6442c0167
7
- data.tar.gz: e7142be85907d2b90b6875cc08bab66c0169a1bab8c1084ba6caf39ebf3039be09015feb56bbbe14a2a065d3f3230845aaec6ed231353b3bb94ad29442d3ff4f
6
+ metadata.gz: 57f1d9ecd8560d94f2a542deb5c78fc4ece8e435b153ad19980ad1fdc0e267be1c0f081019eb69396600bb21d8dc0d27b0b4c95c6f2f96f89fcd1518a1a80b1c
7
+ data.tar.gz: 403efac259b7d0036365ea05fd0bba0f22a44d644056eb313a7182a18e5f0e6930e2bfd8232fa2f29cf0d113de73fb898540329e59b16e5d71f0083e343b7dde
data/README.md CHANGED
@@ -119,5 +119,10 @@ To build and install a gem run:
119
119
  ```
120
120
  rake build
121
121
  gem install pkg/gclouder-<version>.gem
122
- gem push pkg/gclouder-<version>.gem
122
+ ```
123
+
124
+ To perform a release
125
+ ```
126
+ # adjust version in lib/gclouder/version.rb then run:
127
+ rake release
123
128
  ```
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module GClouder
4
+ module Resources
5
+ module Storage
6
+ module Buckets
7
+ include GClouder::Logging
8
+ include GClouder::Shell
9
+ include GClouder::Resource::Cleaner
10
+
11
+ def self.header(stage = :ensure)
12
+ info "[#{stage}] storage / buckets", title: true, indent: 1
13
+ end
14
+
15
+ def self.validate
16
+ return if Local.list.empty?
17
+ header :validate
18
+ Local.validate
19
+ end
20
+
21
+ def self.ensure
22
+ return if Local.list.empty?
23
+ header
24
+
25
+ Local.list.each do |region, region_config|
26
+ info region, heading: true, indent: 2
27
+ region_config.each do |bucket|
28
+ info
29
+ Bucket.ensure(region, bucket)
30
+ end
31
+ end
32
+ end
33
+
34
+ module Local
35
+ def self.list
36
+ instances
37
+ end
38
+
39
+ def self.validate
40
+ # Validation knowledge included here because we don't have arguments parser for gsutil.
41
+ # We also don't support every key that gsutil does. See Bucket.ensure() below.
42
+ permitted_and_required_keys = {
43
+ "default_access"=>{"type"=>"String", "required"=>true}
44
+ }
45
+
46
+ Resources::Validate::Region.instances(
47
+ instances,
48
+ permitted_keys: permitted_and_required_keys
49
+ )
50
+ end
51
+
52
+ def self.instances
53
+ Resources::Region.instances(path: ["storage", "buckets"])
54
+ end
55
+ end
56
+
57
+ module Remote
58
+ include GClouder::GSUtil
59
+
60
+ # FIXME: make more robust(!)
61
+ def self.list
62
+ gsutil("ls", "-L").to_s.split("gs://").delete_if(&:empty?).each_with_object({}) do |data, collection|
63
+ normalized = data.split("\n").map! { |b| b.delete("\t") }
64
+ bucket_name = normalized[0].delete("/ :")
65
+ region = normalized.select { |e| e.match("^Location constraint:") }.last.split(":").last.downcase
66
+ collection[region] ||= []
67
+ collection[region] << { "name" => bucket_name }
68
+ end
69
+ end
70
+ end
71
+
72
+ module Bucket
73
+ include GClouder::GSUtil
74
+ include GClouder::Config::CLIArgs
75
+
76
+ def self.setDefaultAccess(bucket_name, default_access)
77
+ info "# gsutil defacl ch -u #{default_access} gs://#{bucket_name}" if cli_args[:debug]
78
+
79
+ return if cli_args[:dry_run]
80
+
81
+ # Just use shell, as -p flag is not valid for 'defacl ch'.
82
+ shell("gsutil defacl ch -u #{default_access} gs://#{bucket_name}")
83
+ end
84
+
85
+ def self.check_exists?(region, bucket_name)
86
+ gsutil_exec("ls", "gs://#{bucket_name} > /dev/null 2>&1 && echo 0 || echo 1").to_i == 0
87
+ end
88
+
89
+ def self.ensure(region, bucket)
90
+ if check_exists?(region, bucket["name"])
91
+ good bucket["name"]
92
+ return
93
+ end
94
+
95
+ add "#{bucket["name"]} [#{bucket["default_access"]}]"
96
+ gsutil "mb", "-l #{region} gs://#{bucket["name"]}"
97
+
98
+
99
+ setDefaultAccess bucket["name"], bucket["default_access"] if bucket.key?("default_access")
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module GClouder
4
+ module Resources
5
+ module Storage
6
+ module Notifications
7
+ include GClouder::Logging
8
+ include GClouder::Shell
9
+
10
+ def self.header(stage = :ensure)
11
+ info "[#{stage}] storage / notifications", title: true, indent: 1
12
+ end
13
+
14
+ def self.validate
15
+ return if Local.list.empty?
16
+ header :validate
17
+ Local.validate
18
+ end
19
+
20
+ def self.ensure
21
+ return if Local.list.empty?
22
+ header
23
+
24
+ Local.list.each do |region, region_config|
25
+ info region, heading: true, indent: 2
26
+ region_config.each do |notification|
27
+ info
28
+ Notification.ensure(notification)
29
+ end
30
+ end
31
+ end
32
+
33
+ module Local
34
+ def self.list
35
+ instances
36
+ end
37
+
38
+ def self.validate
39
+ # Validation knowledge included here because we don't have arguments parser for gsutil.
40
+ # We also don't support every key that gsutil does. See Notification.ensure() below.
41
+ permitted_and_required_keys = {
42
+ "bucket"=>{"type"=>"String", "required"=>true},
43
+ "topic"=>{"type"=>"String", "required"=>true},
44
+ "events"=>{"type"=>"Array", "required"=>false}
45
+ }
46
+
47
+ Resources::Validate::Region.instances(
48
+ instances,
49
+ permitted_keys: permitted_and_required_keys
50
+ )
51
+ end
52
+
53
+ def self.instances
54
+ Resources::Region.instances(path: ["storage", "notifications"])
55
+ end
56
+ end
57
+
58
+ module Notification
59
+ include GClouder::GSUtil
60
+ include GClouder::Config::CLIArgs
61
+
62
+ def self.notification_exists?(notification)
63
+ notifications_exist = gsutil_exec("notification list", " gs://#{notification["bucket"]} > /dev/null 2>&1 && echo 0 || echo 1").to_i == 0
64
+ if not notifications_exist
65
+ return false
66
+ end
67
+
68
+ return gsutil("notification list", "gs://#{notification["bucket"]}", force: true)
69
+ .include?("projects/#{project["project_id"]}/topics/#{notification["topic"]}")
70
+
71
+ end
72
+
73
+ def self.ensure(notification)
74
+ if notification_exists?(notification)
75
+ good "notification topic: #{notification["name"]}; bucket: #{notification["bucket"]}", indent: 4
76
+ return
77
+ end
78
+
79
+ event_type_args = ""
80
+ if notification.has_key?("events")
81
+ event_type_args = "-e #{notification["events"].join(",")}"
82
+ end
83
+
84
+ args = "-t #{notification["name"]} #{event_type_args} -f json gs://#{notification["bucket"]}"
85
+
86
+ add "notification topic: #{notification["name"]}; bucket: #{notification["bucket"]}", indent: 4
87
+ gsutil "notification create", args
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  module GClouder
4
- VERSION = "0.1.7"
4
+ VERSION = "0.1.8"
5
5
  end
data/lib/gclouder.rb CHANGED
@@ -53,7 +53,8 @@ require "gclouder/resources/project_id"
53
53
  require "gclouder/resources/project"
54
54
  require "gclouder/resources/project/iam_policy_binding.rb"
55
55
 
56
- require "gclouder/resources/storagebuckets"
56
+ require "gclouder/resources/storage/buckets"
57
+ require "gclouder/resources/storage/notifications"
57
58
 
58
59
  require "gclouder/resources/compute/networks"
59
60
  require "gclouder/resources/compute/networks/subnets"
@@ -161,10 +162,16 @@ module GClouder
161
162
 
162
163
  {
163
164
  name: "storage-buckets",
164
- module: Resources::StorageBuckets,
165
+ module: Resources::Storage::Buckets,
165
166
  skip: [ :check ],
166
167
  },
167
168
 
169
+ {
170
+ name: "storage-notifications",
171
+ module: Resources::Storage::Notifications,
172
+ skip: [ :check, :clean ],
173
+ },
174
+
168
175
  {
169
176
  name: "networks",
170
177
  module: Resources::Compute::Networks,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gclouder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Wilson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-08 00:00:00.000000000 Z
12
+ date: 2017-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: trollop
@@ -251,7 +251,8 @@ files:
251
251
  - lib/gclouder/resources/project_id.rb
252
252
  - lib/gclouder/resources/pubsub/subscriptions.rb
253
253
  - lib/gclouder/resources/pubsub/topics.rb
254
- - lib/gclouder/resources/storagebuckets.rb
254
+ - lib/gclouder/resources/storage/buckets.rb
255
+ - lib/gclouder/resources/storage/notifications.rb
255
256
  - lib/gclouder/resources/validate/global.rb
256
257
  - lib/gclouder/resources/validate/local.rb
257
258
  - lib/gclouder/resources/validate/region.rb
@@ -1,103 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- module GClouder
4
- module Resources
5
- module StorageBuckets
6
- include GClouder::Logging
7
- include GClouder::Shell
8
- include GClouder::Resource::Cleaner
9
-
10
- def self.header(stage = :ensure)
11
- info "[#{stage}] storage / buckets", title: true, indent: 1
12
- end
13
-
14
- def self.validate
15
- return if Local.list.empty?
16
- header :validate
17
- Local.validate
18
- end
19
-
20
- def self.ensure
21
- return if Local.list.empty?
22
- header
23
-
24
- Local.list.each do |region, region_config|
25
- info region, heading: true, indent: 2
26
- region_config.each do |bucket|
27
- info
28
- StorageBucket.ensure(region, bucket)
29
- end
30
- end
31
- end
32
-
33
- module Local
34
- def self.list
35
- instances
36
- end
37
-
38
- def self.validate
39
- # Validation knowledge included here because we don't have arguments parser for gsutil.
40
- # We also don't support every key that gsutil does. See StorageBucket.ensure() below.
41
- permitted_and_required_keys = {
42
- "default_access"=>{"type"=>"String", "required"=>true}
43
- }
44
-
45
- Resources::Validate::Region.instances(
46
- instances,
47
- permitted_keys: permitted_and_required_keys
48
- )
49
- end
50
-
51
- def self.instances
52
- Resources::Region.instances(path: ["storage", "buckets"])
53
- end
54
- end
55
-
56
- module Remote
57
- include GClouder::GSUtil
58
-
59
- # FIXME: make more robust(!)
60
- def self.list
61
- gsutil("ls", "-L").to_s.split("gs://").delete_if(&:empty?).each_with_object({}) do |data, collection|
62
- normalized = data.split("\n").map! { |b| b.delete("\t") }
63
- bucket_name = normalized[0].delete("/ :")
64
- region = normalized.select { |e| e.match("^Location constraint:") }.last.split(":").last.downcase
65
- collection[region] ||= []
66
- collection[region] << { "name" => bucket_name }
67
- end
68
- end
69
- end
70
-
71
- module StorageBucket
72
- include GClouder::GSUtil
73
- include GClouder::Config::CLIArgs
74
-
75
- def self.setDefaultAccess(bucket_name, default_access)
76
- info "# gsutil defacl ch -u #{default_access} gs://#{bucket_name}" if cli_args[:debug]
77
-
78
- return if cli_args[:dry_run]
79
-
80
- # Just use shell, as -p flag is not valid for 'defacl ch'.
81
- shell("gsutil defacl ch -u #{default_access} gs://#{bucket_name}")
82
- end
83
-
84
- def self.check_exists?(region, bucket_name)
85
- gsutil_exec("ls", "gs://#{bucket_name} > /dev/null 2>&1 && echo 0 || echo 1").to_i == 0
86
- end
87
-
88
- def self.ensure(region, bucket)
89
- if check_exists?(region, bucket["name"])
90
- good bucket["name"]
91
- return
92
- end
93
-
94
- add "#{bucket["name"]} [#{bucket["default_access"]}]"
95
- gsutil "mb", "-l #{region} gs://#{bucket["name"]}"
96
-
97
-
98
- setDefaultAccess bucket["name"], bucket["default_access"] if bucket.key?("default_access")
99
- end
100
- end
101
- end
102
- end
103
- end