1+ require 'open3'
2+
13module Bosh ::Director
24 class ReleaseJob
35
@@ -11,6 +13,8 @@ def initialize(job_meta, release_model, release_dir, logger)
1113 end
1214
1315 def update
16+ validate_job_meta_identifiers!
17+
1418 unpack
1519
1620 job_manifest = load_manifest
@@ -30,11 +34,11 @@ def update
3034
3135 if job_model . blobstore_id
3236 begin
33- @logger . info ( "Deleting blob for job '#{ name } /#{ @ version} ' with blobstore_id '#{ job_model . blobstore_id } '" )
37+ @logger . info ( "Deleting blob for job '#{ name } /#{ version } ' with blobstore_id '#{ job_model . blobstore_id } '" )
3438 BlobUtil . delete_blob ( job_model . blobstore_id )
3539 job_model . blobstore_id = nil
3640 rescue Bosh ::Director ::Blobstore ::BlobstoreError => e
37- @logger . info ( "Error deleting blob for job '#{ name } /#{ @ version} ' with blobstore_id '#{ job_model . blobstore_id } ': #{ e . inspect } " )
41+ @logger . info ( "Error deleting blob for job '#{ name } /#{ version } ' with blobstore_id '#{ job_model . blobstore_id } ': #{ e . inspect } " )
3842 end
3943 end
4044
@@ -48,16 +52,26 @@ def update
4852 def unpack
4953 FileUtils . mkdir_p ( job_dir )
5054
51- desc = "job '#{ name } /#{ @version } '"
52- result = Bosh ::Common ::Exec . sh ( "tar -C #{ job_dir } -xf #{ job_tgz } 2>&1" , :on_error => :return )
53- if result . failed?
55+ desc = "job '#{ name } /#{ version } '"
56+ out , err , status = Open3 . capture3 ( 'tar' , '-C' , job_dir , '-xf' , job_tgz )
57+ combined = [ out , err ] . map ( &:to_s ) . join
58+ if status . exitstatus != 0
5459 @logger . error ( "Extracting #{ desc } archive failed in dir #{ job_dir } , " +
55- "tar returned #{ result . exit_status } , " +
56- "output: #{ result . output } " )
60+ "tar returned #{ status . exitstatus } , " +
61+ "output: #{ combined } " )
5762 raise JobInvalidArchive , "Extracting #{ desc } archive failed. Check task debug log for details."
5863 end
5964 end
6065
66+ def validate_job_meta_identifiers!
67+ if !@job_meta [ 'name' ] . is_a? ( String ) || !Models ::VALID_ID . match? ( @job_meta [ 'name' ] )
68+ raise JobInvalidName , "Invalid job name in release manifest: #{ @job_meta [ 'name' ] . inspect } "
69+ end
70+ if !@job_meta [ 'version' ] . is_a? ( String ) || !Models ::VALID_ID . match? ( @job_meta [ 'version' ] )
71+ raise ValidationInvalidValue , "Invalid job version in release manifest: #{ @job_meta [ 'version' ] . inspect } "
72+ end
73+ end
74+
6175 def job_tgz
6276 @job_tgz ||= File . join ( @release_dir , 'jobs' , "#{ name } .tgz" )
6377 end
@@ -176,5 +190,9 @@ def validate_consume_links(consume_links)
176190 def name
177191 @job_meta [ 'name' ]
178192 end
193+
194+ def version
195+ @job_meta [ 'version' ]
196+ end
179197 end
180198end
0 commit comments