Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
8c398e5
update: forgot to make
saisona Jun 27, 2022
1612c5f
Update: try with this version
saisona Jun 27, 2022
2ff8ad0
update: get back to old one
saisona Jun 27, 2022
afb7ec6
Update
saisona Jun 27, 2022
0dc8fd7
Update
saisona Jun 27, 2022
0f71294
Update deps
saisona Jun 27, 2022
c278086
adding degug instead of info
saisona Jun 27, 2022
a887226
Update with make
saisona Jun 27, 2022
4389192
test
saisona Jun 27, 2022
e0c173c
update
saisona Jun 27, 2022
1c1865c
adding console.log
saisona Jun 27, 2022
c29f9a1
UPDATE WITH STRINGIFY
saisona Jun 27, 2022
9f9ff5c
UPDATE WITH STRINGIFY
saisona Jun 27, 2022
573d9f8
UPDATE WITH STRINGIFY
saisona Jun 27, 2022
657cb24
Update with make
saisona Jun 27, 2022
0d0d3fb
Update: fixing typo
saisona Jun 27, 2022
c6822a4
Merge branch 'master' into dev
saisona Jun 27, 2022
e84a72a
Update with no logs
saisona Jun 27, 2022
8c2013a
Update with read -> update
saisona Jun 30, 2022
82448c9
update: handling update
saisona Jun 30, 2022
1bb9287
update: typo
saisona Jun 30, 2022
05b3101
Update: typo + handling update
saisona Jun 30, 2022
a2ea3e5
Update: final fix
saisona Jun 30, 2022
58de002
update: try
saisona Jul 1, 2022
b321ca9
update + logs
saisona Jul 1, 2022
2d1c1b7
update + logs 2
saisona Jul 1, 2022
16a7ef7
update + logs 3
saisona Jul 1, 2022
b818773
update + logs 4
saisona Jul 1, 2022
6a0dc0e
update + logs 5
saisona Jul 1, 2022
18a3230
Fixing update issue
saisona Jul 1, 2022
3b901bb
Update: remove bad logs
saisona Aug 16, 2022
2f5d724
Update: fix
saisona Aug 16, 2022
6125c54
Update: fixed v2
saisona Aug 18, 2022
6ffe081
Update: some fixes
saisona Aug 18, 2022
c6297e5
Update: fix typo
saisona Aug 19, 2022
bb2d17d
Update: fix typo
saisona Aug 20, 2022
66198d0
New release
saisona Aug 20, 2022
fc00c02
New release
saisona Aug 20, 2022
12662ca
New release
saisona Aug 20, 2022
4328815
New release
saisona Aug 20, 2022
5252b9a
New release
saisona Aug 20, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/test-ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ jobs:
argocdEndpoint: "https://argocd.inarix.com"
applicationName: "nginx"
actionName: "get"
- name: flush result
run: echo $(echo "${{steps.readApplication.outputs.application}}" | jq)'
update-application:
name: update created application
needs: read-application
Expand Down
68 changes: 52 additions & 16 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8485,9 +8485,8 @@ function fixResponseChunkedTransferBadEnding(request, errorCallback) {
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
const { getInput, info, setFailed, setOutput, getBooleanInput, debug } = __nccwpck_require__(619)
const { getInput, info, setFailed, setOutput, getBooleanInput } = __nccwpck_require__(619)
const fetch = __nccwpck_require__(748)
const json = JSON

const getInputs = () => {
try {
Expand Down Expand Up @@ -8551,14 +8550,12 @@ const getInputs = () => {
}

const generateOpts = (method = "", bearerToken = "", bodyObj) => {
if (method == "delete" || method == "get") {
if (method == "delete" || method == "get" || bodyObj == null) {
return { method, headers: { "Authorization": `Bearer ${bearerToken}` } }
} else if (bodyObj == null) {
return { method, headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` } }
} else if (method == "restart") {
return { method: "post", body: bodyObj, headers: { "Content-Type": "multipart/form-data", "Authorization": `Bearer ${bearerToken}` } }
}
payload = { method, body: JSON.stringify(bodyObj), headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` }, }
console.log(`The event payload: ${JSON.stringify(payload.body)}`);
return payload
return { method, body: JSON.stringify(bodyObj), headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` } }
}

const checkReady = (inputs = getInputs(), retry = inputs.maxRetry) => {
Expand All @@ -8579,7 +8576,10 @@ const checkReady = (inputs = getInputs(), retry = inputs.maxRetry) => {

const checkResponse = (method, response) => {
info(`Response from ${method} request at ${response.url}: [${response.status}] ${response.statusText}.`)
if ((response.status >= 200 && response.status < 300) || response.status == 400) {
if ((response.status >= 200 && response.status < 300)) {
return response;
} else if (response.status == 400) {
info(`[${response.status}] ${response.statusText} from ${method}::${response.url}: ${JSON.stringify(response)}.`)
return response;
}
throw new Error(`${response.url} ${response.statusText}: ${JSON.stringify(response)}`);
Expand All @@ -8605,27 +8605,37 @@ const syncApplication = (inputs = getInputs()) => {
const createApplication = (inputs = getInputs()) => {
specs = generateSpecs(inputs)
info(`[CREATE] Sending request to ${inputs.endpoint}/api/v1/applications`)
console.log("[CREATE] specs", JSON.stringify(specs))
return fetch.default(`${inputs.endpoint}/api/v1/applications`, generateOpts("post", inputs.token, specs))
.then((response) => checkResponse("POST", response))
.then(r => r.json())
.then(jsonObj => setOutput("application", JSON.stringify(jsonObj)))
.catch(err => setFailed(err))
}

const readApplication = (inputs = getInputs()) => {
const readApplication = (inputs = getInputs(), to_update = false) => {
info(`[READ] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`)
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`, generateOpts("get", inputs.token, null))
.then((response) => checkResponse("GET", response))
.then(r => r.json())
.then(jsonObj => setOutput("application", JSON.stringify(jsonObj)))
.then(jsonObj => {
if (!to_update) {
setOutput("application", JSON.stringify(jsonObj))
}
return jsonObj
})
.catch(err => setFailed(err))
}

const updateApplication = (inputs = getInputs()) => {
const updateApplication = (inputs = getInputs(), previous_helm = []) => {
info(`[UPDATE] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`)
info("[UPDATE] specs", JSON.stringify(specs))
specs = generateSpecs(inputs)
params = specs.spec.source.helm.parameters
for (hP of previous_helm) {
param = params.find((h) => hP.name == h.name)
if (!!param)
hP.value = param.value
}
specs.spec.source.helm.parameters = previous_helm
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`, generateOpts("put", inputs.token, specs))
.then((response) => checkResponse("PUT", response))
.catch(err => setFailed(err))
Expand All @@ -8639,6 +8649,14 @@ const deleteApplication = (inputs = getInputs()) => {
.catch(err => setFailed(err))
}

const restartApplication = (inputs = getInputs(), last_deploy = { "group": "apps", "version": "v1", "kind": "Deployment", "namespace": "", "name": "" }) => {
namespace = last_deploy.namespace
resourceName = last_deploy.name
info(`[RESTART] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}/resource/actions?namespace=${namespace}&resourceName=${resourceName}version=v1&kind=Deployment&group=apps`)
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}/resource/actions?namespace=${namespace}&resourceName=${resourceName}version=v1&kind=Deployment&group=apps`, generateOpts("restart", inputs.token, "restart"))
.then((response) => checkResponse("post", response))
}

const parseApplicationParams = (appParams = "") => {
return appParams.split(";").map((v) => {
const [name, value] = v.split("=", 2)
Expand Down Expand Up @@ -8719,10 +8737,28 @@ const main = () => {
prom = createApplication(inputs)
break
case "update":
prom = updateApplication(inputs)
prom = readApplication(inputs, true).then(obj => obj?.spec?.source?.helm?.parameters).then((helm_params) => {
if (Array.isArray(helm_params) && helm_params.length > 0) {
return updateApplication(inputs, helm_params)
}
throw new Error(`Helm parameters must exists and be a non empty array ${Array.isArray(helm_params)}`)
})
break
case "restart":
prom = readApplication(inputs, true).then(obj => obj?.status?.resources).then((resources) => {
if (Array.isArray(resources) && resources.length > 0) {
console.log("Resources = ", resources)
resourceFiltered = resources.filter((resObj) => resObj?.kind == "Deployment")
if (resourceFiltered.length == 1) {
return restartApplication(inputs, resourceFiltered.pop())
} else {
throw new Error(`Cannot find any deployement to restart in application ${inputs.applicationName}`)
}
}
throw new Error(`Helm parameters must exists and be a non empty array`)
})
default:
setFailed(new Error(`${inputs.action} does not exists in (create, get|read, update, delete)`))
setFailed(new Error(`${inputs.action} does not exists in (create, get|read, update, delete, restart)`))
return
}
if (prom != null) {
Expand Down
67 changes: 52 additions & 15 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { getInput, info, setFailed, setOutput, getBooleanInput, debug } = require("@actions/core")
const { getInput, info, setFailed, setOutput, getBooleanInput } = require("@actions/core")
const fetch = require("node-fetch")

const getInputs = () => {
Expand Down Expand Up @@ -63,14 +63,12 @@ const getInputs = () => {
}

const generateOpts = (method = "", bearerToken = "", bodyObj) => {
if (method == "delete" || method == "get") {
if (method == "delete" || method == "get" || bodyObj == null) {
return { method, headers: { "Authorization": `Bearer ${bearerToken}` } }
} else if (bodyObj == null) {
return { method, headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` } }
} else if (method == "restart") {
return { method: "post", body: bodyObj, headers: { "Content-Type": "multipart/form-data", "Authorization": `Bearer ${bearerToken}` } }
}
payload = { method, body: JSON.stringify(bodyObj), headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` }, }
console.log(`The event payload: ${JSON.stringify(payload.body)}`);
return payload
return { method, body: JSON.stringify(bodyObj), headers: { "Content-Type": "application/json", "Authorization": `Bearer ${bearerToken}` } }
}

const checkReady = (inputs = getInputs(), retry = inputs.maxRetry) => {
Expand All @@ -91,7 +89,10 @@ const checkReady = (inputs = getInputs(), retry = inputs.maxRetry) => {

const checkResponse = (method, response) => {
info(`Response from ${method} request at ${response.url}: [${response.status}] ${response.statusText}.`)
if ((response.status >= 200 && response.status < 300) || response.status == 400) {
if ((response.status >= 200 && response.status < 300)) {
return response;
} else if (response.status == 400) {
info(`[${response.status}] ${response.statusText} from ${method}::${response.url}: ${JSON.stringify(response)}.`)
return response;
}
throw new Error(`${response.url} ${response.statusText}: ${JSON.stringify(response)}`);
Expand All @@ -117,27 +118,37 @@ const syncApplication = (inputs = getInputs()) => {
const createApplication = (inputs = getInputs()) => {
specs = generateSpecs(inputs)
info(`[CREATE] Sending request to ${inputs.endpoint}/api/v1/applications`)
console.log("[CREATE] specs", JSON.stringify(specs))
return fetch.default(`${inputs.endpoint}/api/v1/applications`, generateOpts("post", inputs.token, specs))
.then((response) => checkResponse("POST", response))
.then(r => r.json())
.then(jsonObj => setOutput("application", JSON.stringify(jsonObj)))
.catch(err => setFailed(err))
}

const readApplication = (inputs = getInputs()) => {
const readApplication = (inputs = getInputs(), to_update = false) => {
info(`[READ] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`)
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`, generateOpts("get", inputs.token, null))
.then((response) => checkResponse("GET", response))
.then(r => r.json())
.then(jsonObj => setOutput("application", JSON.stringify(jsonObj)))
.then(jsonObj => {
if (!to_update) {
setOutput("application", JSON.stringify(jsonObj))
}
return jsonObj
})
.catch(err => setFailed(err))
}

const updateApplication = (inputs = getInputs()) => {
const updateApplication = (inputs = getInputs(), previous_helm = []) => {
info(`[UPDATE] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`)
info("[UPDATE] specs", JSON.stringify(specs))
specs = generateSpecs(inputs)
params = specs.spec.source.helm.parameters
for (hP of previous_helm) {
param = params.find((h) => hP.name == h.name)
if (!!param)
hP.value = param.value
}
specs.spec.source.helm.parameters = previous_helm
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}`, generateOpts("put", inputs.token, specs))
.then((response) => checkResponse("PUT", response))
.catch(err => setFailed(err))
Expand All @@ -151,6 +162,14 @@ const deleteApplication = (inputs = getInputs()) => {
.catch(err => setFailed(err))
}

const restartApplication = (inputs = getInputs(), last_deploy = { "group": "apps", "version": "v1", "kind": "Deployment", "namespace": "", "name": "" }) => {
namespace = last_deploy.namespace
resourceName = last_deploy.name
info(`[RESTART] Sending request to ${inputs.endpoint}/api/v1/applications/${inputs.applicationName}/resource/actions?namespace=${namespace}&resourceName=${resourceName}version=v1&kind=Deployment&group=apps`)
return fetch.default(`${inputs.endpoint}/api/v1/applications/${inputs.applicationName}/resource/actions?namespace=${namespace}&resourceName=${resourceName}version=v1&kind=Deployment&group=apps`, generateOpts("restart", inputs.token, "restart"))
.then((response) => checkResponse("post", response))
}

const parseApplicationParams = (appParams = "") => {
return appParams.split(";").map((v) => {
const [name, value] = v.split("=", 2)
Expand Down Expand Up @@ -231,10 +250,28 @@ const main = () => {
prom = createApplication(inputs)
break
case "update":
prom = updateApplication(inputs)
prom = readApplication(inputs, true).then(obj => obj?.spec?.source?.helm?.parameters).then((helm_params) => {
if (Array.isArray(helm_params) && helm_params.length > 0) {
return updateApplication(inputs, helm_params)
}
throw new Error(`Helm parameters must exists and be a non empty array ${Array.isArray(helm_params)}`)
})
break
case "restart":
prom = readApplication(inputs, true).then(obj => obj?.status?.resources).then((resources) => {
if (Array.isArray(resources) && resources.length > 0) {
console.log("Resources = ", resources)
resourceFiltered = resources.filter((resObj) => resObj?.kind == "Deployment")
if (resourceFiltered.length == 1) {
return restartApplication(inputs, resourceFiltered.pop())
} else {
throw new Error(`Cannot find any deployement to restart in application ${inputs.applicationName}`)
}
}
throw new Error(`Helm parameters must exists and be a non empty array`)
})
default:
setFailed(new Error(`${inputs.action} does not exists in (create, get|read, update, delete)`))
setFailed(new Error(`${inputs.action} does not exists in (create, get|read, update, delete, restart)`))
return
}
if (prom != null) {
Expand Down