magellan-gcs-proxy 0.1.4 → 0.2.0
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 +4 -4
- data/example/Dockerfile +1 -2
- data/example/Gemfile.lock +1 -13
- data/exe/magellan-gcs-proxy-dev-progress-listener +1 -1
- data/lib/magellan/gcs/proxy.rb +1 -0
- data/lib/magellan/gcs/proxy/cli.rb +5 -4
- data/lib/magellan/gcs/proxy/gcp.rb +17 -3
- data/lib/magellan/gcs/proxy/pubsub_subscription.rb +86 -0
- data/lib/magellan/gcs/proxy/pubsub_sustainer.rb +1 -1
- data/lib/magellan/gcs/proxy/version.rb +1 -1
- data/magellan-gcs-proxy.gemspec +0 -1
- metadata +3 -17
- data/example/VERSION +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97082e16910f8eb448e9dd90a579dab3f5d2645b
|
4
|
+
data.tar.gz: b8ef0a1084a6da1b9287a9806c91ebd1e73b0ba8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 412d7f881615ba6bb467cd655d69a60701297f1bcd0a32be6bea745cf41a517f88dc0d3631c628a545e2a9d5c4acb586b02bbd1fa0f596e7d471f5d7968780ec
|
7
|
+
data.tar.gz: cda4e394851a8f65fc5edd6564faae8dda6ad74c9f1fe2c52a4b1953ddca4f48775be4138703516f8245cb9dec25b13d99cc6980d4002197c7fe91a1ace7ed79
|
data/example/Dockerfile
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
# [config] IMAGE_NAME: "groovenauts/batch_type_iot_example"
|
2
2
|
# [config]
|
3
3
|
# [config] WORKING_DIR: "."
|
4
|
-
# [config]
|
4
|
+
# [config] VERSION_SCRIPT: "ruby -r ../lib/magellan/gcs/proxy/version.rb -e 'puts Magellan::Gcs::Proxy::VERSION'"
|
5
5
|
# [config] GIT_TAG_PREFIX: 'example/'
|
6
|
-
# [config]
|
7
6
|
|
8
7
|
FROM ruby:2.3
|
9
8
|
|
data/example/Gemfile.lock
CHANGED
@@ -33,13 +33,6 @@ GEM
|
|
33
33
|
googleapis-common-protos (~> 1.3)
|
34
34
|
grpc (~> 1.0)
|
35
35
|
orderedhash (= 0.0.6)
|
36
|
-
google-cloud-pubsub (0.21.0)
|
37
|
-
google-cloud-core (~> 0.21.0)
|
38
|
-
google-gax (~> 0.6.0)
|
39
|
-
google-protobuf (~> 3.0)
|
40
|
-
googleapis-common-protos (~> 1.3)
|
41
|
-
grpc (~> 1.0)
|
42
|
-
grpc-google-iam-v1 (~> 0.6.8)
|
43
36
|
google-cloud-storage (0.23.1)
|
44
37
|
digest-crc (~> 0.4)
|
45
38
|
google-api-client (~> 0.9.11)
|
@@ -64,10 +57,6 @@ GEM
|
|
64
57
|
grpc (1.0.1)
|
65
58
|
google-protobuf (~> 3.0.2)
|
66
59
|
googleauth (~> 0.5.1)
|
67
|
-
grpc-google-iam-v1 (0.6.8)
|
68
|
-
googleapis-common-protos (~> 1.3.1)
|
69
|
-
googleauth (~> 0.5.1)
|
70
|
-
grpc (~> 1.0)
|
71
60
|
httpclient (2.8.3)
|
72
61
|
hurley (0.2)
|
73
62
|
jwt (1.5.6)
|
@@ -76,10 +65,9 @@ GEM
|
|
76
65
|
logging (2.1.0)
|
77
66
|
little-plugger (~> 1.1)
|
78
67
|
multi_json (~> 1.10)
|
79
|
-
magellan-gcs-proxy (0.
|
68
|
+
magellan-gcs-proxy (0.2.0)
|
80
69
|
dotenv
|
81
70
|
google-cloud-logging
|
82
|
-
google-cloud-pubsub
|
83
71
|
google-cloud-storage
|
84
72
|
logger_pipe
|
85
73
|
memoist (0.15.0)
|
@@ -5,7 +5,7 @@ require 'json'
|
|
5
5
|
|
6
6
|
subname = ARGV.first
|
7
7
|
puts "Listening to #{subname}"
|
8
|
-
Magellan::Gcs::Proxy::
|
8
|
+
Magellan::Gcs::Proxy::PubsubSubscription.new(subname).tap do |sub|
|
9
9
|
sub.listen do |msg|
|
10
10
|
attrs = { 'data' => msg.data }.update(msg.attributes)
|
11
11
|
puts attrs.map { |k, v| "#{k}:#{v}" }.join("\t")
|
data/lib/magellan/gcs/proxy.rb
CHANGED
@@ -10,6 +10,7 @@ require 'magellan/gcs/proxy/gcp'
|
|
10
10
|
require 'magellan/gcs/proxy/composite_logger'
|
11
11
|
require 'magellan/gcs/proxy/progress_notifier_adapter'
|
12
12
|
require 'magellan/gcs/proxy/pubsub_progress_notifier'
|
13
|
+
require 'magellan/gcs/proxy/pubsub_subscription'
|
13
14
|
require 'magellan/gcs/proxy/pubsub_sustainer'
|
14
15
|
require 'magellan/gcs/proxy/progress_notification'
|
15
16
|
|
@@ -35,7 +35,7 @@ module Magellan
|
|
35
35
|
verbose("Backtrace\n " << e.backtrace.join("\n "))
|
36
36
|
end
|
37
37
|
|
38
|
-
TOTAL =
|
38
|
+
TOTAL = 14
|
39
39
|
def process(msg)
|
40
40
|
context = Context.new(msg)
|
41
41
|
context.notify(1, TOTAL, "Processing message: #{msg.inspect}")
|
@@ -48,11 +48,12 @@ module Magellan
|
|
48
48
|
context.process_with_notification([5, 6, 7], TOTAL, 'Command', exec) do
|
49
49
|
context.process_with_notification([8, 9, 10], TOTAL, 'Upload', &:upload)
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
context.process_with_notification([11, 12, 13], TOTAL, 'Acknowledge') do
|
52
|
+
msg.acknowledge!
|
53
|
+
end
|
53
54
|
end
|
54
55
|
end
|
55
|
-
context.notify(
|
56
|
+
context.notify(14, TOTAL, 'Cleanup')
|
56
57
|
end
|
57
58
|
|
58
59
|
def build_command(context)
|
@@ -3,8 +3,8 @@ require 'magellan/gcs/proxy'
|
|
3
3
|
|
4
4
|
require 'google/cloud/logging'
|
5
5
|
require 'google/cloud/logging/version'
|
6
|
-
require 'google/cloud/pubsub'
|
7
6
|
require 'google/cloud/storage'
|
7
|
+
require 'google/apis/pubsub_v1'
|
8
8
|
require 'net/http'
|
9
9
|
|
10
10
|
module Magellan
|
@@ -24,6 +24,20 @@ module Magellan
|
|
24
24
|
ENV['BLOCKS_BATCH_PROJECT_ID'] || retrieve_metadata('project/project-id')
|
25
25
|
end
|
26
26
|
|
27
|
+
SCOPES = [
|
28
|
+
'https://www.googleapis.com/auth/devstorage.full_control',
|
29
|
+
'https://www.googleapis.com/auth/pubsub',
|
30
|
+
].freeze
|
31
|
+
|
32
|
+
def auth
|
33
|
+
@auth ||= new_auth
|
34
|
+
end
|
35
|
+
|
36
|
+
def new_auth
|
37
|
+
logger.debug("#{self.class.name}#new_auth")
|
38
|
+
Google::Auth.get_application_default(SCOPES).tap(&:fetch_access_token!)
|
39
|
+
end
|
40
|
+
|
27
41
|
METADATA_HOST = 'metadata.google.internal'.freeze
|
28
42
|
METADATA_PATH_BASE = '/computeMetadata/v1/'.freeze
|
29
43
|
METADATA_HEADER = { 'Metadata-Flavor' => 'Google' }.freeze
|
@@ -42,12 +56,12 @@ module Magellan
|
|
42
56
|
end
|
43
57
|
|
44
58
|
def pubsub
|
45
|
-
@pubsub ||= Google::
|
59
|
+
@pubsub ||= Google::Apis::PubsubV1::PubsubService.new.tap { |api| api.authorization = auth }
|
46
60
|
end
|
47
61
|
|
48
62
|
def subscription
|
49
63
|
unless @subscription
|
50
|
-
@subscription =
|
64
|
+
@subscription = PubsubSubscription.new(ENV['BLOCKS_BATCH_PUBSUB_SUBSCRIPTION'] || 'test-subscription')
|
51
65
|
logger.info("subscription: #{@subscription.inspect}")
|
52
66
|
end
|
53
67
|
@subscription
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'magellan/gcs/proxy'
|
2
|
+
require 'magellan/gcs/proxy/log'
|
3
|
+
|
4
|
+
module Magellan
|
5
|
+
module Gcs
|
6
|
+
module Proxy
|
7
|
+
class PubsubSubscription
|
8
|
+
attr_reader :name, :delay
|
9
|
+
def initialize(name, delay: 1)
|
10
|
+
@name = name
|
11
|
+
@delay = delay
|
12
|
+
end
|
13
|
+
|
14
|
+
def listen
|
15
|
+
loop do
|
16
|
+
if msg = wait_for_message
|
17
|
+
yield msg
|
18
|
+
else
|
19
|
+
sleep delay
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def pull_req
|
25
|
+
@pull_req ||= Google::Apis::PubsubV1::PullRequest.new(max_messages: 1, return_immediately: true)
|
26
|
+
end
|
27
|
+
|
28
|
+
def wait_for_message
|
29
|
+
# #<Google::Apis::PubsubV1::ReceivedMessage:0x007fdc440b58d8
|
30
|
+
# @ack_id="...",
|
31
|
+
# @message=#<Google::Apis::PubsubV1::Message:0x007fdc440be140
|
32
|
+
# @attributes={"download_files"=>"[\"gs://bucket1/path/to/file1\"]"},
|
33
|
+
# @message_id="50414480536440",
|
34
|
+
# @publish_time="2016-12-17T08:08:35.599Z">>
|
35
|
+
res = GCP.pubsub.pull_subscription(name, pull_req)
|
36
|
+
msg = (res.received_messages || []).first
|
37
|
+
msg.nil? ? nil : MessageWrapper.new(self, msg)
|
38
|
+
end
|
39
|
+
|
40
|
+
class MessageWrapper
|
41
|
+
attr_reader :subscription, :original
|
42
|
+
|
43
|
+
# @param [Magellan::Gcs::Proxy::PubsubSubscription] subscription
|
44
|
+
# @param [Google::Apis::PubsubV1::ReceivedMessage] original
|
45
|
+
def initialize(subscription, original)
|
46
|
+
@subscription = subscription
|
47
|
+
@original = original
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_missing(name, *args, &block)
|
51
|
+
receiver =
|
52
|
+
case name
|
53
|
+
when :message_id, :attributes, :publish_time, :data then original.message
|
54
|
+
when :ack_id then original
|
55
|
+
end
|
56
|
+
receiver ? receiver.send(name, *args, &block) : super
|
57
|
+
end
|
58
|
+
|
59
|
+
def respond_to_missing?(name)
|
60
|
+
case name
|
61
|
+
when :message_id, :attributes, :publish_time, :data then true
|
62
|
+
when :ack_id then true
|
63
|
+
else false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def ack_options
|
68
|
+
# https://github.com/google/google-api-ruby-client/blob/master/lib/google/apis/options.rb#L48
|
69
|
+
@ack_options ||= { authorization: GCP.auth, retries: 10 }
|
70
|
+
end
|
71
|
+
|
72
|
+
def acknowledge!
|
73
|
+
req = Google::Apis::PubsubV1::AcknowledgeRequest.new(ack_ids: [ack_id])
|
74
|
+
GCP.pubsub.acknowledge_subscription(subscription.name, req, options: ack_options)
|
75
|
+
end
|
76
|
+
alias ack! acknowledge!
|
77
|
+
|
78
|
+
def delay!(new_deadline)
|
79
|
+
req = Google::Apis::PubsubV1::ModifyAckDeadlineRequest.new(ack_deadline_seconds: new_deadline, ack_ids: [ack_id])
|
80
|
+
GCP.pubsub.modify_subscription_ack_deadline(subscription.name, req)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -63,7 +63,7 @@ module Magellan
|
|
63
63
|
debug("is sending delay!(#{delay})")
|
64
64
|
message.delay! delay
|
65
65
|
debug("sent delay!(#{delay}) successfully")
|
66
|
-
rescue Google::
|
66
|
+
rescue Google::Apis::ServerError => e
|
67
67
|
if Time.now.to_f < next_deadline
|
68
68
|
sleep(1) # retry interval
|
69
69
|
debug("is retrying to send delay! cause of [#{e.class.name}] #{e.message}")
|
data/magellan-gcs-proxy.gemspec
CHANGED
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_runtime_dependency 'dotenv'
|
25
25
|
spec.add_runtime_dependency 'google-cloud-logging'
|
26
|
-
spec.add_runtime_dependency 'google-cloud-pubsub'
|
27
26
|
spec.add_runtime_dependency 'google-cloud-storage'
|
28
27
|
spec.add_runtime_dependency 'logger_pipe'
|
29
28
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magellan-gcs-proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dotenv
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: google-cloud-pubsub
|
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
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: google-cloud-storage
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,7 +134,6 @@ files:
|
|
148
134
|
- example/Gemfile
|
149
135
|
- example/Gemfile.lock
|
150
136
|
- example/README.md
|
151
|
-
- example/VERSION
|
152
137
|
- example/app.sh
|
153
138
|
- example/config.yml
|
154
139
|
- exe/magellan-gcs-proxy
|
@@ -166,6 +151,7 @@ files:
|
|
166
151
|
- lib/magellan/gcs/proxy/progress_notification.rb
|
167
152
|
- lib/magellan/gcs/proxy/progress_notifier_adapter.rb
|
168
153
|
- lib/magellan/gcs/proxy/pubsub_progress_notifier.rb
|
154
|
+
- lib/magellan/gcs/proxy/pubsub_subscription.rb
|
169
155
|
- lib/magellan/gcs/proxy/pubsub_sustainer.rb
|
170
156
|
- lib/magellan/gcs/proxy/version.rb
|
171
157
|
- magellan-gcs-proxy.gemspec
|
data/example/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.1
|