|
3 | 3 | * SPDX-License-Identifier: Apache-2.0
|
4 | 4 | */
|
5 | 5 |
|
6 |
| -'use strict' |
7 |
| - |
8 | 6 | const { join } = require('path')
|
9 |
| -const minimist = require('minimist') |
10 | 7 | const stream = require('stream')
|
11 | 8 | const { promisify } = require('util')
|
12 | 9 | const { createWriteStream, promises } = require('fs')
|
13 |
| -const rimraf = require('rimraf') |
| 10 | +const { rimraf } = require('rimraf') |
14 | 11 | const fetch = require('node-fetch')
|
15 | 12 | const crossZip = require('cross-zip')
|
16 | 13 | const ora = require('ora')
|
17 | 14 |
|
18 |
| -const { mkdir, writeFile } = promises |
| 15 | +const { mkdir, cp } = promises |
19 | 16 | const pipeline = promisify(stream.pipeline)
|
20 | 17 | const unzip = promisify(crossZip.unzip)
|
21 |
| -const rm = promisify(rimraf) |
22 |
| - |
23 |
| -const esFolder = join(__dirname, '..', 'elasticsearch') |
24 |
| -const zipFolder = join(esFolder, 'artifacts.zip') |
25 |
| -const specFolder = join(esFolder, 'rest-api-spec', 'api') |
26 |
| -const freeTestFolder = join(esFolder, 'rest-api-spec', 'test', 'free') |
27 |
| -const xPackTestFolder = join(esFolder, 'rest-api-spec', 'test', 'platinum') |
28 |
| -const artifactInfo = join(esFolder, 'info.json') |
29 |
| - |
30 |
| -async function downloadArtifacts (opts) { |
31 |
| - if (typeof opts.version !== 'string') { |
32 |
| - throw new Error('Missing version') |
33 |
| - } |
34 | 18 |
|
35 |
| - const log = ora('Checking out spec and test').start() |
| 19 | +const testYamlFolder = join(__dirname, '..', 'yaml-rest-tests') |
| 20 | +const zipFile = join(__dirname, '..', 'elasticsearch-clients-tests.zip') |
36 | 21 |
|
37 |
| - log.text = 'Resolving versions' |
38 |
| - let resolved |
39 |
| - try { |
40 |
| - resolved = await resolve(opts.version, opts.hash) |
41 |
| - } catch (err) { |
42 |
| - log.fail(err.message) |
43 |
| - process.exit(1) |
44 |
| - } |
| 22 | +const schemaFolder = join(__dirname, '..', 'schema') |
| 23 | +const schemaJson = join(schemaFolder, 'schema.json') |
45 | 24 |
|
46 |
| - opts.id = opts.id || resolved.id |
47 |
| - opts.hash = opts.hash || resolved.hash |
48 |
| - opts.version = resolved.version |
| 25 | +async function downloadArtifacts (localTests, version = 'main') { |
| 26 | + const log = ora('Checking out spec and test').start() |
49 | 27 |
|
50 |
| - const info = loadInfo() |
| 28 | + const { GITHUB_TOKEN } = process.env |
51 | 29 |
|
52 |
| - if (info && info.version === opts.version) { |
53 |
| - if (info.hash === opts.hash && info.id === opts.id) { |
54 |
| - log.succeed('The artifact copy present locally is already up to date') |
55 |
| - return |
56 |
| - } |
| 30 | + if (version !== 'main') { |
| 31 | + version = version.split('.').slice(0, 2).join('.') |
57 | 32 | }
|
58 | 33 |
|
59 |
| - log.text = 'Cleanup checkouts/elasticsearch' |
60 |
| - await rm(esFolder) |
61 |
| - await mkdir(esFolder, { recursive: true }) |
| 34 | + log.text = 'Clean tests folder' |
| 35 | + await rimraf(testYamlFolder) |
| 36 | + await mkdir(testYamlFolder, { recursive: true }) |
62 | 37 |
|
63 |
| - log.text = 'Downloading artifacts' |
64 |
| - const response = await fetch(resolved.url) |
65 |
| - if (!response.ok) { |
66 |
| - log.fail(`unexpected response ${response.statusText}`) |
67 |
| - process.exit(1) |
68 |
| - } |
69 |
| - await pipeline(response.body, createWriteStream(zipFolder)) |
| 38 | + log.text = `Fetch test YAML files for version ${version}` |
70 | 39 |
|
71 |
| - log.text = 'Unzipping' |
72 |
| - await unzip(zipFolder, esFolder) |
| 40 | + if (localTests) { |
| 41 | + log.text = `Copying local tests from ${localTests}` |
| 42 | + await cp(localTests, testYamlFolder, { recursive: true }) |
| 43 | + } else { |
| 44 | + if (!GITHUB_TOKEN) { |
| 45 | + log.fail("Missing required environment variable 'GITHUB_TOKEN'") |
| 46 | + process.exit(1) |
| 47 | + } |
73 | 48 |
|
74 |
| - log.text = 'Cleanup' |
75 |
| - await rm(zipFolder) |
| 49 | + const response = await fetch(`https://api.github.com/repos/elastic/elasticsearch-clients-tests/zipball/${version}`, { |
| 50 | + headers: { |
| 51 | + Authorization: `Bearer ${GITHUB_TOKEN}`, |
| 52 | + Accept: 'application/vnd.github+json' |
| 53 | + } |
| 54 | + }) |
76 | 55 |
|
77 |
| - log.text = 'Update info' |
78 |
| - await writeFile(artifactInfo, JSON.stringify(opts), 'utf8') |
| 56 | + if (!response.ok) { |
| 57 | + log.fail(`unexpected response ${response.statusText}`) |
| 58 | + process.exit(1) |
| 59 | + } |
79 | 60 |
|
80 |
| - log.succeed('Done') |
81 |
| -} |
| 61 | + log.text = 'Downloading tests zipball' |
| 62 | + await pipeline(response.body, createWriteStream(zipFile)) |
82 | 63 |
|
83 |
| -function loadInfo () { |
84 |
| - try { |
85 |
| - return require(artifactInfo) |
86 |
| - } catch (err) { |
87 |
| - return null |
88 |
| - } |
89 |
| -} |
| 64 | + log.text = 'Unzipping tests' |
| 65 | + await unzip(zipFile, testYamlFolder) |
90 | 66 |
|
91 |
| -async function resolve (version, hash) { |
92 |
| - const response = await fetch(`https://artifacts-api.elastic.co/v1/versions/${version}`) |
93 |
| - if (!response.ok) { |
94 |
| - throw new Error(`unexpected response ${response.statusText}`) |
| 67 | + log.text = 'Cleanup' |
| 68 | + await rimraf(zipFile) |
95 | 69 | }
|
96 | 70 |
|
97 |
| - const data = await response.json() |
98 |
| - const esBuilds = data.version.builds |
99 |
| - .filter(build => build.projects.elasticsearch != null) |
100 |
| - .map(build => { |
101 |
| - return { |
102 |
| - projects: build.projects.elasticsearch, |
103 |
| - buildId: build.build_id, |
104 |
| - date: build.start_time, |
105 |
| - version: build.version |
106 |
| - } |
107 |
| - }) |
108 |
| - .sort((a, b) => { |
109 |
| - const dA = new Date(a.date) |
110 |
| - const dB = new Date(b.date) |
111 |
| - if (dA > dB) return -1 |
112 |
| - if (dA < dB) return 1 |
113 |
| - return 0 |
114 |
| - }) |
| 71 | + log.text = 'Fetching Elasticsearch specification' |
| 72 | + await rimraf(schemaFolder) |
| 73 | + await mkdir(schemaFolder, { recursive: true }) |
115 | 74 |
|
116 |
| - if (hash != null) { |
117 |
| - const build = esBuilds.find(build => build.projects.commit_hash === hash) |
118 |
| - if (!build) { |
119 |
| - throw new Error(`Can't find any build with hash '${hash}'`) |
120 |
| - } |
121 |
| - const zipKey = Object.keys(build.projects.packages).find(key => key.startsWith('rest-resources-zip-') && key.endsWith('.zip')) |
122 |
| - return { |
123 |
| - url: build.projects.packages[zipKey].url, |
124 |
| - id: build.buildId, |
125 |
| - hash: build.projects.commit_hash, |
126 |
| - version: build.version |
127 |
| - } |
| 75 | + const response = await fetch(`https://raw.githubusercontent.com/elastic/elasticsearch-specification/${version}/output/schema/schema.json`) |
| 76 | + if (!response.ok) { |
| 77 | + log.fail(`unexpected response ${response.statusText}`) |
| 78 | + process.exit(1) |
128 | 79 | }
|
129 | 80 |
|
130 |
| - const lastBuild = esBuilds[0] |
131 |
| - const zipKey = Object.keys(lastBuild.projects.packages).find(key => key.startsWith('rest-resources-zip-') && key.endsWith('.zip')) |
132 |
| - return { |
133 |
| - url: lastBuild.projects.packages[zipKey].url, |
134 |
| - id: lastBuild.buildId, |
135 |
| - hash: lastBuild.projects.commit_hash, |
136 |
| - version: lastBuild.version |
137 |
| - } |
| 81 | + log.text = 'Downloading schema.json' |
| 82 | + await pipeline(response.body, createWriteStream(schemaJson)) |
| 83 | + |
| 84 | + log.succeed('Done') |
138 | 85 | }
|
139 | 86 |
|
140 |
| -async function main (options) { |
141 |
| - delete options._ |
142 |
| - await downloadArtifacts(options) |
| 87 | +async function main () { |
| 88 | + await downloadArtifacts() |
143 | 89 | }
|
| 90 | + |
144 | 91 | if (require.main === module) {
|
145 | 92 | process.on('unhandledRejection', function (err) {
|
146 | 93 | console.error(err)
|
147 | 94 | process.exit(1)
|
148 | 95 | })
|
149 | 96 |
|
150 |
| - const options = minimist(process.argv.slice(2), { |
151 |
| - string: ['id', 'version', 'hash'] |
152 |
| - }) |
153 |
| - main(options).catch(t => { |
| 97 | + main().catch(t => { |
154 | 98 | console.log(t)
|
155 | 99 | process.exit(2)
|
156 | 100 | })
|
157 | 101 | }
|
158 | 102 |
|
159 | 103 | module.exports = downloadArtifacts
|
160 |
| -module.exports.locations = { |
161 |
| - specFolder, |
162 |
| - freeTestFolder, |
163 |
| - xPackTestFolder |
164 |
| -} |
| 104 | +module.exports.locations = { testYamlFolder, zipFile, schemaJson } |
0 commit comments