pipe_fitter 0.1.8 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 892c113ee708c1620229690aa80940b4cd2ec4df
4
- data.tar.gz: ec8b73ebbd4f064f944ee640158782d76291b16d
3
+ metadata.gz: e48d74a4939c001d71118aa2beb5a6640cbfdee2
4
+ data.tar.gz: 22a9bfd2f2b2b84a5e66502238ab5463bec312a1
5
5
  SHA512:
6
- metadata.gz: 5a3801e39e26c40dd1dda5411d23fce072f3d95f56496b600dfc02a98f4ed29b0dc8f6732c8469bd6f089ec69c75fafc07eafb7e6c89af764cf08c8325ad4679
7
- data.tar.gz: 8053e25626a894251dd2bb93b7c261728c64bac31fc6984d3847713114a02a11da0cc79732d02dc7d038718854c835349b1cf6af9bb1608644181aff33283bf9
6
+ metadata.gz: f724eaa70e4218f9f78b7529ed930b13c11cf1444db263d01142dccb2a6316af9fb2f722ca810b911c420771efc55f7fca30e23a5203209cfc2d81f19c494c64
7
+ data.tar.gz: 989b378d7811ce383b7d9e0719e3866c18745360563820632b001ee8189703a20d2c2be299de286704650237385ba01305b5c081fd9a210727c8f6e7fa2b5436
data/exe/pipe_fitter CHANGED
@@ -49,6 +49,46 @@ module PipeFitter
49
49
  puts Pipeline.load_yaml(definition_file).to_yaml
50
50
  end
51
51
 
52
+ desc "find", "Find pipeline besed on name and uniqueId"
53
+ def find(definition_file)
54
+ puts client.find_registered(definition_file).to_h.to_json
55
+ end
56
+
57
+ desc "find_diff", "Find pipeline besed on name and uniqueId, show diff"
58
+ option :format, type: :string, default: "color", aliases: "f"
59
+ def find_diff(definition_file)
60
+ p = client.find_registered(definition_file)
61
+ abort("Pipeline is not registered") if p.nil?
62
+ puts client.diff(p.id, definition_file, options[:format])
63
+ end
64
+
65
+ desc "find_update", "Find pipeline besed on name and uniqueId, update pipeline definition"
66
+ option :force_update, type: :boolean, aliases: "f"
67
+ def find_update(definition_file)
68
+ p = client.find_registered(definition_file)
69
+ abort("Pipeline is not registered") if p.nil?
70
+ unless options[:force_update]
71
+ puts client.diff(p.id, definition_file)
72
+ print "\nReally update pipeline definition? [y/N] : "
73
+ abort("Update was canceled") if $stdin.gets.chomp !~ /^y$/i
74
+ end
75
+ res = client.update(p.id, definition_file)
76
+ puts JSON.pretty_generate(res)
77
+ end
78
+
79
+ desc "diff_deploy_files DEFINITION_FILE", "Show deploy files differences"
80
+ option :format, type: :string, default: "color", aliases: "f"
81
+ def diff_deploy_files(definition_file)
82
+ client.diff_deploy_files(definition_file, options[:format]).each do |d|
83
+ puts d
84
+ end
85
+ end
86
+
87
+ desc "upload_deploy_files DEFINITION_FILE", "Upload deploy files"
88
+ def upload_deploy_files(definition_file)
89
+ client.upload_deploy_files(definition_file)
90
+ end
91
+
52
92
  private
53
93
 
54
94
  def client
@@ -1,4 +1,6 @@
1
1
  require "aws-sdk"
2
+ require "uri"
3
+ require "s3diff"
2
4
 
3
5
  module PipeFitter
4
6
  class NoSuchPipelineError < StandardError; end
@@ -9,17 +11,21 @@ module PipeFitter
9
11
  end
10
12
 
11
13
  def register(definition_file)
12
- p = Pipeline.load_yaml(definition_file)
14
+ p = load_pipeline(definition_file)
13
15
  create(p)
14
16
  end
15
17
 
16
18
  def diff(pipeline_id, definition_file, format = :color)
17
- p = Pipeline.load_yaml(definition_file)
18
- definition(pipeline_id).diff(p, format.to_sym)
19
+ p = load_pipeline(definition_file)
20
+ [
21
+ definition(pipeline_id).diff(p, format.to_sym),
22
+ diff_deploy_files(definition_file, format.to_sym),
23
+ ].compact.reject(&:empty?).join("\n")
19
24
  end
20
25
 
21
26
  def update(pipeline_id, definition_file)
22
- p = Pipeline.load_yaml(definition_file)
27
+ upload_deploy_files(definition_file)
28
+ p = load_pipeline(definition_file)
23
29
  put_definition(pipeline_id, p)
24
30
  end
25
31
 
@@ -40,18 +46,57 @@ module PipeFitter
40
46
  end
41
47
 
42
48
  def activate(pipeline_id, parameter_file, start_timestamp)
43
- p = parameter_file ? Pipeline.load_yaml(parameter_file) : Pipeline.new
49
+ p = parameter_file ? load_pipeline(parameter_file) : Pipeline.new
44
50
  exec(:activate_pipeline, p.activate_opts(pipeline_id, start_timestamp)).to_h
45
51
  end
46
52
 
53
+ def find_registered(definition_file)
54
+ p = load_pipeline(definition_file)
55
+ pls = list_pipelines.select { |l| l.name == p.pipeline_description.name }
56
+ res = pls.find do |pl|
57
+ d = Pipeline::PipelineDescription.create(description(pl.id))
58
+ d.unique_id == p.pipeline_description.unique_id
59
+ end
60
+ res
61
+ end
62
+
63
+ def diff_deploy_files(definition_file, format = :color)
64
+ p = load_pipeline(definition_file)
65
+ p.deploy_files.map do |df|
66
+ c = S3diff::Comparator.new(df[:dst], df[:src])
67
+ c.diff.to_s(format.to_sym) unless c.same?
68
+ end.compact
69
+ end
70
+
71
+ def upload_deploy_files(definition_file)
72
+ p = load_pipeline(definition_file)
73
+ p.deploy_files.each do |df|
74
+ put_object(df[:src], df[:dst])
75
+ end
76
+ end
77
+
47
78
  private
48
79
 
80
+ def load_pipeline(definition_file)
81
+ Pipeline.load_yaml(definition_file)
82
+ end
83
+
49
84
  def description(pipeline_id)
50
85
  desc = exec(:describe_pipelines, pipeline_ids: [pipeline_id]).pipeline_description_list.first
51
86
  raise NoSuchPipelineError, pipeline_id if desc.nil?
52
87
  desc
53
88
  end
54
89
 
90
+ def list_pipelines
91
+ res = exec(:list_pipelines)
92
+ pls = res.pipeline_id_list
93
+ while res.has_more_results
94
+ res = exec(:list_pipelines, marker: res.marker)
95
+ pls.concat(res.pipeline_id_list)
96
+ end
97
+ pls
98
+ end
99
+
55
100
  def sync_tags(pipeline_id, pipeline)
56
101
  p = definition(pipeline_id)
57
102
  return if p.tags == pipeline.tags
@@ -65,10 +110,24 @@ module PipeFitter
65
110
  raise NoSuchPipelineError, args.unshift(e.class)
66
111
  end
67
112
 
113
+ def put_object(src, dst)
114
+ u = URI.parse(dst)
115
+ s3client.put_object(
116
+ body: File.read(src),
117
+ bucket: u.host,
118
+ key: u.path.sub(%r{^/}, "")
119
+ )
120
+ puts "put #{src} to #{dst}"
121
+ end
122
+
68
123
  def client
69
124
  @client ||= Aws::DataPipeline::Client.new(sdk_opts)
70
125
  end
71
126
 
127
+ def s3client
128
+ @s3client ||= Aws::S3::Client.new(sdk_opts)
129
+ end
130
+
72
131
  def sdk_opts
73
132
  keys = %i(region profile).freeze
74
133
  @options.select { |k, _| keys.include?(k) }
@@ -7,6 +7,8 @@ module PipeFitter
7
7
  class Pipeline
8
8
  Diffy::Diff.default_options.merge!(diff: "-u", include_diff_info: true)
9
9
 
10
+ attr_reader :pipline_object, :parameter_objects, :parameter_values, :pipeline_description, :deploy_files
11
+
10
12
  def self.create(definition_from_api, description_from_api)
11
13
  new(PipelineObjects.create(definition_from_api[:pipeline_objects]),
12
14
  ParameterObjects.create(definition_from_api[:parameter_objects]),
@@ -20,15 +22,17 @@ module PipeFitter
20
22
  new(PipelineObjects.new(yml["pipeline_objects"]),
21
23
  ParameterObjects.new(yml["parameter_objects"]),
22
24
  ParameterValues.new(yml["parameter_values"]),
23
- PipelineDescription.new(yml["pipeline_description"]))
25
+ PipelineDescription.new(yml["pipeline_description"]),
26
+ DeployFiles.new(yml["deploy_files"], filepath))
24
27
  end
25
28
 
26
29
  def initialize(pipeline_objects = nil, parameter_objects = nil,
27
- parameter_values = nil, pipeline_description = nil)
30
+ parameter_values = nil, pipeline_description = nil, deploy_files = nil)
28
31
  @pipeline_objects = pipeline_objects
29
32
  @parameter_objects = parameter_objects
30
33
  @parameter_values = parameter_values
31
34
  @pipeline_description = pipeline_description
35
+ @deploy_files = deploy_files
32
36
  end
33
37
 
34
38
  def tags
@@ -228,10 +232,11 @@ module PipeFitter
228
232
  new(objs)
229
233
  end
230
234
 
231
- def initialize(objs)
235
+ def initialize(objs, filepath = nil)
232
236
  @objs = symbolize_keys(objs || {}).sort_by do |k, v|
233
237
  [DESCRIPTION_KEYS.index(k) || DESCRIPTION_KEYS.size + 1, k.to_s, v.to_s]
234
238
  end.to_h
239
+ @filepath = filepath
235
240
  end
236
241
 
237
242
  DESCRIPTION_KEYS = %i(name description tags uniqueId).freeze
@@ -260,6 +265,30 @@ module PipeFitter
260
265
  def tag_keys
261
266
  @objs[:tags].map(&:keys).flatten
262
267
  end
268
+
269
+ def name
270
+ @objs[:name]
271
+ end
272
+
273
+ def unique_id
274
+ @objs[:uniqueId]
275
+ end
276
+ end
277
+
278
+ class DeployFiles
279
+ include Enumerable
280
+
281
+ def initialize(objs, filepath)
282
+ @objs = objs
283
+ @filepath = filepath
284
+ end
285
+
286
+ def each
287
+ (@objs || []).map do |df|
288
+ h = { src: File.join(@filepath.dirname, df["src"]), dst: df["dst"] }
289
+ yield h
290
+ end
291
+ end
263
292
  end
264
293
  end
265
294
  end
@@ -1,3 +1,3 @@
1
1
  module PipeFitter
2
- VERSION = "0.1.8"
2
+ VERSION = "0.2.0"
3
3
  end
data/pipe_fitter.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency "diffy"
24
24
  spec.add_runtime_dependency "thor"
25
25
  spec.add_runtime_dependency "hashie"
26
+ spec.add_runtime_dependency "s3diff"
26
27
 
27
28
  spec.add_development_dependency "bundler", "~> 1.11"
28
29
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipe_fitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - masa21kik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-19 00:00:00.000000000 Z
11
+ date: 2017-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: s3diff
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: bundler
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -193,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
207
  version: '0'
194
208
  requirements: []
195
209
  rubyforge_project:
196
- rubygems_version: 2.5.1
210
+ rubygems_version: 2.6.13
197
211
  signing_key:
198
212
  specification_version: 4
199
213
  summary: PipeFitter is a tool for AWS Data Pipeline.