td-client 1.0.0-java
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/data/ca-bundle.crt +3448 -0
- data/lib/td-client.rb +1 -0
- data/lib/td/client.rb +606 -0
- data/lib/td/client/api.rb +707 -0
- data/lib/td/client/api/access_control.rb +74 -0
- data/lib/td/client/api/account.rb +45 -0
- data/lib/td/client/api/bulk_import.rb +184 -0
- data/lib/td/client/api/bulk_load.rb +172 -0
- data/lib/td/client/api/database.rb +50 -0
- data/lib/td/client/api/export.rb +38 -0
- data/lib/td/client/api/import.rb +38 -0
- data/lib/td/client/api/job.rb +390 -0
- data/lib/td/client/api/partial_delete.rb +27 -0
- data/lib/td/client/api/result.rb +46 -0
- data/lib/td/client/api/schedule.rb +120 -0
- data/lib/td/client/api/server_status.rb +21 -0
- data/lib/td/client/api/table.rb +132 -0
- data/lib/td/client/api/user.rb +134 -0
- data/lib/td/client/api_error.rb +37 -0
- data/lib/td/client/compat_gzip_reader.rb +22 -0
- data/lib/td/client/model.rb +816 -0
- data/lib/td/client/version.rb +5 -0
- data/lib/td/core_ext/openssl/ssl/sslcontext/set_params.rb +18 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/td/client/access_control_api_spec.rb +37 -0
- data/spec/td/client/account_api_spec.rb +34 -0
- data/spec/td/client/api_error_spec.rb +77 -0
- data/spec/td/client/api_spec.rb +269 -0
- data/spec/td/client/api_ssl_connection_spec.rb +109 -0
- data/spec/td/client/bulk_import_spec.rb +199 -0
- data/spec/td/client/bulk_load_spec.rb +401 -0
- data/spec/td/client/db_api_spec.rb +123 -0
- data/spec/td/client/export_api_spec.rb +51 -0
- data/spec/td/client/import_api_spec.rb +148 -0
- data/spec/td/client/job_api_spec.rb +833 -0
- data/spec/td/client/model_job_spec.rb +136 -0
- data/spec/td/client/model_schedule_spec.rb +26 -0
- data/spec/td/client/model_schema_spec.rb +134 -0
- data/spec/td/client/partial_delete_api_spec.rb +58 -0
- data/spec/td/client/result_api_spec.rb +77 -0
- data/spec/td/client/sched_api_spec.rb +109 -0
- data/spec/td/client/server_status_api_spec.rb +25 -0
- data/spec/td/client/spec_resources.rb +99 -0
- data/spec/td/client/table_api_spec.rb +226 -0
- data/spec/td/client/user_api_spec.rb +118 -0
- data/spec/td/client_sched_spec.rb +79 -0
- data/spec/td/client_spec.rb +46 -0
- metadata +271 -0
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            class TreasureData::API
         | 
| 2 | 
            +
            module AccessControl
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              ####
         | 
| 5 | 
            +
              ## Access Control API
         | 
| 6 | 
            +
              ##
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              # @param [String] subject
         | 
| 9 | 
            +
              # @param [String] action
         | 
| 10 | 
            +
              # @param [String] scope
         | 
| 11 | 
            +
              # @param [Array] grant_option
         | 
| 12 | 
            +
              # @return [true]
         | 
| 13 | 
            +
              def grant_access_control(subject, action, scope, grant_option)
         | 
| 14 | 
            +
                params = {'subject'=>subject, 'action'=>action, 'scope'=>scope, 'grant_option'=>grant_option.to_s}
         | 
| 15 | 
            +
                code, body, res = post("/v3/acl/grant", params)
         | 
| 16 | 
            +
                if code != "200"
         | 
| 17 | 
            +
                  raise_error("Granting access control failed", res)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                return true
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # @param [String] subject
         | 
| 23 | 
            +
              # @param [String] action
         | 
| 24 | 
            +
              # @param [String] scope
         | 
| 25 | 
            +
              # @return [true]
         | 
| 26 | 
            +
              def revoke_access_control(subject, action, scope)
         | 
| 27 | 
            +
                params = {'subject'=>subject, 'action'=>action, 'scope'=>scope}
         | 
| 28 | 
            +
                code, body, res = post("/v3/acl/revoke", params)
         | 
| 29 | 
            +
                if code != "200"
         | 
| 30 | 
            +
                  raise_error("Revoking access control failed", res)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                return true
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # @param [String] user
         | 
| 36 | 
            +
              # @param [String] action
         | 
| 37 | 
            +
              # @param [String] scope
         | 
| 38 | 
            +
              # @return [Array]
         | 
| 39 | 
            +
              def test_access_control(user, action, scope)
         | 
| 40 | 
            +
                params = {'user'=>user, 'action'=>action, 'scope'=>scope}
         | 
| 41 | 
            +
                code, body, res = get("/v3/acl/test", params)
         | 
| 42 | 
            +
                if code != "200"
         | 
| 43 | 
            +
                  raise_error("Testing access control failed", res)
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
                js = checked_json(body, %w[permission access_controls])
         | 
| 46 | 
            +
                perm = js["permission"]
         | 
| 47 | 
            +
                acl = js["access_controls"].map {|roleinfo|
         | 
| 48 | 
            +
                  subject = roleinfo['subject']
         | 
| 49 | 
            +
                  action = roleinfo['action']
         | 
| 50 | 
            +
                  scope = roleinfo['scope']
         | 
| 51 | 
            +
                  [name, action, scope]
         | 
| 52 | 
            +
                }
         | 
| 53 | 
            +
                return perm, acl
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              # @return [Array]
         | 
| 57 | 
            +
              def list_access_controls
         | 
| 58 | 
            +
                code, body, res = get("/v3/acl/list")
         | 
| 59 | 
            +
                if code != "200"
         | 
| 60 | 
            +
                  raise_error("Listing access control failed", res)
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                js = checked_json(body, %w[access_controls])
         | 
| 63 | 
            +
                acl = js["access_controls"].map {|roleinfo|
         | 
| 64 | 
            +
                  subject = roleinfo['subject']
         | 
| 65 | 
            +
                  action = roleinfo['action']
         | 
| 66 | 
            +
                  scope = roleinfo['scope']
         | 
| 67 | 
            +
                  grant_option = roleinfo['grant_option']
         | 
| 68 | 
            +
                  [subject, action, scope, grant_option]
         | 
| 69 | 
            +
                }
         | 
| 70 | 
            +
                return acl
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            end
         | 
| 74 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            class TreasureData::API
         | 
| 2 | 
            +
            module Account
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              ####
         | 
| 5 | 
            +
              ## Account API
         | 
| 6 | 
            +
              ##
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              # @return [Array]
         | 
| 9 | 
            +
              def show_account
         | 
| 10 | 
            +
                code, body, res = get("/v3/account/show")
         | 
| 11 | 
            +
                if code != "200"
         | 
| 12 | 
            +
                  raise_error("Show account failed", res)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                js = checked_json(body, %w[account])
         | 
| 15 | 
            +
                a = js["account"]
         | 
| 16 | 
            +
                account_id = a['id'].to_i
         | 
| 17 | 
            +
                plan = a['plan'].to_i
         | 
| 18 | 
            +
                storage_size = a['storage_size'].to_i
         | 
| 19 | 
            +
                guaranteed_cores = a['guaranteed_cores'].to_i
         | 
| 20 | 
            +
                maximum_cores = a['maximum_cores'].to_i
         | 
| 21 | 
            +
                created_at = a['created_at']
         | 
| 22 | 
            +
                return [account_id, plan, storage_size, guaranteed_cores, maximum_cores, created_at]
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              # @param [Fixnum] from
         | 
| 26 | 
            +
              # @param [Fixnum] to
         | 
| 27 | 
            +
              # @return [Array]
         | 
| 28 | 
            +
              def account_core_utilization(from, to)
         | 
| 29 | 
            +
                params = { }
         | 
| 30 | 
            +
                params['from'] = from.to_s if from
         | 
| 31 | 
            +
                params['to'] = to.to_s if to
         | 
| 32 | 
            +
                code, body, res = get("/v3/account/core_utilization", params)
         | 
| 33 | 
            +
                if code != "200"
         | 
| 34 | 
            +
                  raise_error("Show account failed", res)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                js = checked_json(body, %w[from to interval history])
         | 
| 37 | 
            +
                from = Time.parse(js['from']).utc
         | 
| 38 | 
            +
                to = Time.parse(js['to']).utc
         | 
| 39 | 
            +
                interval = js['interval'].to_i
         | 
| 40 | 
            +
                history = js['history']
         | 
| 41 | 
            +
                return [from, to, interval, history]
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,184 @@ | |
| 1 | 
            +
            class TreasureData::API
         | 
| 2 | 
            +
            module BulkImport
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              ####
         | 
| 5 | 
            +
              ## Bulk import API
         | 
| 6 | 
            +
              ##
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              # @param [String] name
         | 
| 9 | 
            +
              # @param [String] db
         | 
| 10 | 
            +
              # @param [String] table
         | 
| 11 | 
            +
              # @param [Hash] opts
         | 
| 12 | 
            +
              # @return [nil]
         | 
| 13 | 
            +
              def create_bulk_import(name, db, table, opts={})
         | 
| 14 | 
            +
                params = opts.dup
         | 
| 15 | 
            +
                code, body, res = post("/v3/bulk_import/create/#{e name}/#{e db}/#{e table}", params)
         | 
| 16 | 
            +
                if code != "200"
         | 
| 17 | 
            +
                  raise_error("Create bulk import failed", res)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                return nil
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # @param [String] name
         | 
| 23 | 
            +
              # @param [Hash] opts
         | 
| 24 | 
            +
              # @return [nil]
         | 
| 25 | 
            +
              def delete_bulk_import(name, opts={})
         | 
| 26 | 
            +
                params = opts.dup
         | 
| 27 | 
            +
                code, body, res = post("/v3/bulk_import/delete/#{e name}", params)
         | 
| 28 | 
            +
                if code != "200"
         | 
| 29 | 
            +
                  raise_error("Delete bulk import failed", res)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                return nil
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              # @param [String] name
         | 
| 35 | 
            +
              # @return [Hash]
         | 
| 36 | 
            +
              def show_bulk_import(name)
         | 
| 37 | 
            +
                code, body, res = get("/v3/bulk_import/show/#{name}")
         | 
| 38 | 
            +
                if code != "200"
         | 
| 39 | 
            +
                  raise_error("Show bulk import failed", res)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
                js = checked_json(body, %w[status])
         | 
| 42 | 
            +
                return js
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              # @param [Hash] opts
         | 
| 46 | 
            +
              # @return [Hash]
         | 
| 47 | 
            +
              def list_bulk_imports(opts={})
         | 
| 48 | 
            +
                params = opts.dup
         | 
| 49 | 
            +
                code, body, res = get("/v3/bulk_import/list", params)
         | 
| 50 | 
            +
                if code != "200"
         | 
| 51 | 
            +
                  raise_error("List bulk imports failed", res)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                js = checked_json(body, %w[bulk_imports])
         | 
| 54 | 
            +
                return js['bulk_imports']
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              # @param [String] name
         | 
| 58 | 
            +
              # @param [Hash] opts
         | 
| 59 | 
            +
              # @return [nil]
         | 
| 60 | 
            +
              def list_bulk_import_parts(name, opts={})
         | 
| 61 | 
            +
                params = opts.dup
         | 
| 62 | 
            +
                code, body, res = get("/v3/bulk_import/list_parts/#{e name}", params)
         | 
| 63 | 
            +
                if code != "200"
         | 
| 64 | 
            +
                  raise_error("List bulk import parts failed", res)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
                js = checked_json(body, %w[parts])
         | 
| 67 | 
            +
                return js['parts']
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              # @param [String] name
         | 
| 71 | 
            +
              # @param [String] part_name
         | 
| 72 | 
            +
              # @param [String, StringIO] stream
         | 
| 73 | 
            +
              # @param [Fixnum] size
         | 
| 74 | 
            +
              # @param [Hash] opts
         | 
| 75 | 
            +
              # @return [nil]
         | 
| 76 | 
            +
              def bulk_import_upload_part(name, part_name, stream, size, opts={})
         | 
| 77 | 
            +
                code, body, res = put("/v3/bulk_import/upload_part/#{e name}/#{e part_name}", stream, size)
         | 
| 78 | 
            +
                if code[0] != ?2
         | 
| 79 | 
            +
                  raise_error("Upload a part failed", res)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
                return nil
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              # @param [String] name
         | 
| 85 | 
            +
              # @param [String] part_name
         | 
| 86 | 
            +
              # @param [Hash] opts
         | 
| 87 | 
            +
              # @return [nil]
         | 
| 88 | 
            +
              def bulk_import_delete_part(name, part_name, opts={})
         | 
| 89 | 
            +
                params = opts.dup
         | 
| 90 | 
            +
                code, body, res = post("/v3/bulk_import/delete_part/#{e name}/#{e part_name}", params)
         | 
| 91 | 
            +
                if code[0] != ?2
         | 
| 92 | 
            +
                  raise_error("Delete a part failed", res)
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
                return nil
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              # @param [String] name
         | 
| 98 | 
            +
              # @param [Hash] opts
         | 
| 99 | 
            +
              # @return [nil]
         | 
| 100 | 
            +
              def freeze_bulk_import(name, opts={})
         | 
| 101 | 
            +
                params = opts.dup
         | 
| 102 | 
            +
                code, body, res = post("/v3/bulk_import/freeze/#{e name}", params)
         | 
| 103 | 
            +
                if code != "200"
         | 
| 104 | 
            +
                  raise_error("Freeze bulk import failed", res)
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
                return nil
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              # @param [String] name
         | 
| 110 | 
            +
              # @param [Hash] opts
         | 
| 111 | 
            +
              # @return [nil]
         | 
| 112 | 
            +
              def unfreeze_bulk_import(name, opts={})
         | 
| 113 | 
            +
                params = opts.dup
         | 
| 114 | 
            +
                code, body, res = post("/v3/bulk_import/unfreeze/#{e name}", params)
         | 
| 115 | 
            +
                if code != "200"
         | 
| 116 | 
            +
                  raise_error("Unfreeze bulk import failed", res)
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
                return nil
         | 
| 119 | 
            +
              end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              # @param [String] name
         | 
| 122 | 
            +
              # @param [Hash] opts
         | 
| 123 | 
            +
              # @return [String] job_id
         | 
| 124 | 
            +
              def perform_bulk_import(name, opts={})
         | 
| 125 | 
            +
                params = opts.dup
         | 
| 126 | 
            +
                code, body, res = post("/v3/bulk_import/perform/#{e name}", params)
         | 
| 127 | 
            +
                if code != "200"
         | 
| 128 | 
            +
                  raise_error("Perform bulk import failed", res)
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
                js = checked_json(body, %w[job_id])
         | 
| 131 | 
            +
                return js['job_id'].to_s
         | 
| 132 | 
            +
              end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
              # @param [String] name
         | 
| 135 | 
            +
              # @param [Hash] opts
         | 
| 136 | 
            +
              # @return [nil]
         | 
| 137 | 
            +
              def commit_bulk_import(name, opts={})
         | 
| 138 | 
            +
                params = opts.dup
         | 
| 139 | 
            +
                code, body, res = post("/v3/bulk_import/commit/#{e name}", params)
         | 
| 140 | 
            +
                if code != "200"
         | 
| 141 | 
            +
                  raise_error("Commit bulk import failed", res)
         | 
| 142 | 
            +
                end
         | 
| 143 | 
            +
                return nil
         | 
| 144 | 
            +
              end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
              # @param [String] name
         | 
| 147 | 
            +
              # @param [Hash] opts
         | 
| 148 | 
            +
              # @param [Proc] block
         | 
| 149 | 
            +
              # @return [Array]
         | 
| 150 | 
            +
              def bulk_import_error_records(name, opts={}, &block)
         | 
| 151 | 
            +
                params = opts.dup
         | 
| 152 | 
            +
                code, body, res = get("/v3/bulk_import/error_records/#{e name}", params)
         | 
| 153 | 
            +
                if code != "200"
         | 
| 154 | 
            +
                  raise_error("Failed to get bulk import error records", res)
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
                if body.nil? || body.empty?
         | 
| 157 | 
            +
                  if block
         | 
| 158 | 
            +
                    return nil
         | 
| 159 | 
            +
                  else
         | 
| 160 | 
            +
                    return []
         | 
| 161 | 
            +
                  end
         | 
| 162 | 
            +
                end
         | 
| 163 | 
            +
                require File.expand_path('../compat_gzip_reader', File.dirname(__FILE__))
         | 
| 164 | 
            +
                u = MessagePack::Unpacker.new(Zlib::GzipReader.new(StringIO.new(body)))
         | 
| 165 | 
            +
                if block
         | 
| 166 | 
            +
                  begin
         | 
| 167 | 
            +
                    u.each(&block)
         | 
| 168 | 
            +
                  rescue EOFError
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
                  nil
         | 
| 171 | 
            +
                else
         | 
| 172 | 
            +
                  result = []
         | 
| 173 | 
            +
                  begin
         | 
| 174 | 
            +
                    u.each {|row|
         | 
| 175 | 
            +
                      result << row
         | 
| 176 | 
            +
                    }
         | 
| 177 | 
            +
                  rescue EOFError
         | 
| 178 | 
            +
                  end
         | 
| 179 | 
            +
                  return result
         | 
| 180 | 
            +
                end
         | 
| 181 | 
            +
              end
         | 
| 182 | 
            +
             | 
| 183 | 
            +
            end
         | 
| 184 | 
            +
            end
         | 
| @@ -0,0 +1,172 @@ | |
| 1 | 
            +
            class TreasureData::API
         | 
| 2 | 
            +
            module BulkLoad
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              ####
         | 
| 5 | 
            +
              ## BulkLoad (Server-side Bulk loader) API
         | 
| 6 | 
            +
              ##
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              #  1. POST   /v3/bulk_loads/guess          - stateless non REST API to return guess result as BulkLoadSession [NEW]
         | 
| 9 | 
            +
              #  2. POST   /v3/bulk_loads/preview        - stateless non REST API to return preview result as BulkLoadSession [NEW]
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              #  3. POST   /v3/job/issue/:type/:database - create a job resource to run BulkLoadSession [EXTENDED]
         | 
| 12 | 
            +
              #  4. POST   /v3/job/kill/:id              - kill the job [ALREADY EXISTS]
         | 
| 13 | 
            +
              #  5. GET    /v3/job/show/:id              - get status of the job [ALREADY EXISTS]
         | 
| 14 | 
            +
              #  6. GET    /v3/job/result/:id            - get result of the job [NOT NEEDED IN Q4] ... because backend feature is not yet implemented
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              #  7. GET    /v3/bulk_loads                - list BulkLoadSession resources [NEW]
         | 
| 17 | 
            +
              #  8. POST   /v3/bulk_loads                - create BulkLoadSession [NEW]
         | 
| 18 | 
            +
              #  9. GET    /v3/bulk_loads/:name          - get BulkLoadSession [NEW]
         | 
| 19 | 
            +
              # 10. PUT    /v3/bulk_loads/:name          - update BulkLoadSession [NEW]
         | 
| 20 | 
            +
              # 11. DELETE /v3/bulk_loads/:name          - delete BulkLoadSession [NEW]
         | 
| 21 | 
            +
              # 12. GET    /v3/bulk_loads/:name/jobs     - list BulkLoadSession job history [NEW]
         | 
| 22 | 
            +
              # 13. POST   /v3/bulk_loads/:name/jobs     - run BulkLoadSession [NEW]
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              # The 'BulkLoadSession' resource in td-api is as follows;
         | 
| 25 | 
            +
              # {
         | 
| 26 | 
            +
              #   "config": {
         | 
| 27 | 
            +
              #     "type": "s3",
         | 
| 28 | 
            +
              #     "access_key_id": s3 access key id,
         | 
| 29 | 
            +
              #     "secret_access_key": s3 secret key,
         | 
| 30 | 
            +
              #     "endpoint": s3 endpoint name,
         | 
| 31 | 
            +
              #     "bucket": s3 bucket name,
         | 
| 32 | 
            +
              #     "path_prefix": "a/prefix/of/files",
         | 
| 33 | 
            +
              #     "decoders": []
         | 
| 34 | 
            +
              #   },
         | 
| 35 | 
            +
              #   "name": account_wide_unique_name,
         | 
| 36 | 
            +
              #   "cron": cron_string,
         | 
| 37 | 
            +
              #   "timezone": timezone_string,
         | 
| 38 | 
            +
              #   "delay": delay_seconds,
         | 
| 39 | 
            +
              #   "database": database_name,
         | 
| 40 | 
            +
              #   "table": table_name
         | 
| 41 | 
            +
              # }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              LIST = '/v3/bulk_loads'
         | 
| 44 | 
            +
              SESSION = LIST +     '/%s'
         | 
| 45 | 
            +
              JOB = SESSION +         '/jobs'
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              # job: Hash -> Hash
         | 
| 48 | 
            +
              def bulk_load_guess(job)
         | 
| 49 | 
            +
                # retry_request = true
         | 
| 50 | 
            +
                path = LIST + '/guess'
         | 
| 51 | 
            +
                res = api { post(path, job.to_json) }
         | 
| 52 | 
            +
                unless res.ok?
         | 
| 53 | 
            +
                  raise_error('BulkLoad configuration guess failed', res)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                JSON.load(res.body)
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              # job: Hash -> Hash
         | 
| 59 | 
            +
              def bulk_load_preview(job)
         | 
| 60 | 
            +
                # retry_request = true
         | 
| 61 | 
            +
                path = LIST + '/preview'
         | 
| 62 | 
            +
                res = api { post(path, job.to_json) }
         | 
| 63 | 
            +
                unless res.ok?
         | 
| 64 | 
            +
                  raise_error('BulkLoad job preview failed', res)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
                JSON.load(res.body)
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              # job: Hash -> String (job_id)
         | 
| 70 | 
            +
              def bulk_load_issue(database, table, job)
         | 
| 71 | 
            +
                type = 'bulkload'
         | 
| 72 | 
            +
                job = job.dup
         | 
| 73 | 
            +
                job['database'] = database
         | 
| 74 | 
            +
                job['table'] = table
         | 
| 75 | 
            +
                path = "/v3/job/issue/#{e type}/#{e database}"
         | 
| 76 | 
            +
                res = api { post(path, job.to_json) }
         | 
| 77 | 
            +
                unless res.ok?
         | 
| 78 | 
            +
                  raise_error('BulkLoad job issuing failed', res)
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
                js = checked_json(res.body)
         | 
| 81 | 
            +
                js['job_id'].to_s
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              # nil -> [Hash]
         | 
| 85 | 
            +
              def bulk_load_list
         | 
| 86 | 
            +
                res = api { get(LIST) }
         | 
| 87 | 
            +
                unless res.ok?
         | 
| 88 | 
            +
                  raise_error("BulkLoadSession list retrieve failed", res)
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                JSON.load(res.body)
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              # name: String, database: String, table: String, job: Hash -> Hash
         | 
| 94 | 
            +
              def bulk_load_create(name, database, table, job, opts = {})
         | 
| 95 | 
            +
                job = job.dup
         | 
| 96 | 
            +
                job['name'] = name
         | 
| 97 | 
            +
                [:cron, :timezone, :delay, :time_column].each do |prop|
         | 
| 98 | 
            +
                  job[prop.to_s] = opts[prop] if opts.key?(prop)
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
                job['database'] = database
         | 
| 101 | 
            +
                job['table'] = table
         | 
| 102 | 
            +
                res = api { post(LIST, job.to_json) }
         | 
| 103 | 
            +
                unless res.ok?
         | 
| 104 | 
            +
                  raise_error("BulkLoadSession: #{name} create failed", res)
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
                JSON.load(res.body)
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              # name: String -> Hash
         | 
| 110 | 
            +
              def bulk_load_show(name)
         | 
| 111 | 
            +
                path = session_path(name)
         | 
| 112 | 
            +
                res = api { get(path) }
         | 
| 113 | 
            +
                unless res.ok?
         | 
| 114 | 
            +
                  raise_error("BulkLoadSession: #{name} retrieve failed", res)
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
                JSON.load(res.body)
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              # name: String, settings: Hash -> Hash
         | 
| 120 | 
            +
              def bulk_load_update(name, settings)
         | 
| 121 | 
            +
                path = session_path(name)
         | 
| 122 | 
            +
                res = api { put(path, settings.to_json) }
         | 
| 123 | 
            +
                unless res.ok?
         | 
| 124 | 
            +
                  raise_error("BulkLoadSession: #{name} update failed", res)
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
                JSON.load(res.body)
         | 
| 127 | 
            +
              end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
              # name: String -> Hash
         | 
| 130 | 
            +
              def bulk_load_delete(name)
         | 
| 131 | 
            +
                path = session_path(name)
         | 
| 132 | 
            +
                res = api { delete(path) }
         | 
| 133 | 
            +
                unless res.ok?
         | 
| 134 | 
            +
                  raise_error("BulkLoadSession: #{name} delete failed", res)
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
                JSON.load(res.body)
         | 
| 137 | 
            +
              end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
              # name: String -> [Hash]
         | 
| 140 | 
            +
              def bulk_load_history(name)
         | 
| 141 | 
            +
                path = job_path(name)
         | 
| 142 | 
            +
                res = api { get(path) }
         | 
| 143 | 
            +
                unless res.ok?
         | 
| 144 | 
            +
                  raise_error("history of BulkLoadSession: #{name} retrieve failed", res)
         | 
| 145 | 
            +
                end
         | 
| 146 | 
            +
                JSON.load(res.body)
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
             | 
| 149 | 
            +
              def bulk_load_run(name, scheduled_time = nil)
         | 
| 150 | 
            +
                path = job_path(name)
         | 
| 151 | 
            +
                opts = {}
         | 
| 152 | 
            +
                opts[:scheduled_time] = scheduled_time.to_s unless scheduled_time.nil?
         | 
| 153 | 
            +
                res = api { post(path, opts.to_json) }
         | 
| 154 | 
            +
                unless res.ok?
         | 
| 155 | 
            +
                  raise_error("BulkLoadSession: #{name} job create failed", res)
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
                js = checked_json(res.body)
         | 
| 158 | 
            +
                js['job_id'].to_s
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
            private
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              def session_path(name)
         | 
| 164 | 
            +
                SESSION % e(name)
         | 
| 165 | 
            +
              end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
              def job_path(name)
         | 
| 168 | 
            +
                JOB % e(name)
         | 
| 169 | 
            +
              end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
            end
         | 
| 172 | 
            +
            end
         |