Skip to content

Commit

Permalink
Initial version (#599)
Browse files Browse the repository at this point in the history
* Initial version
* Adding debug info
* v1.0.1 Renaming variable
---------
Signed-off-by: Laurent Rochette <[email protected]>
  • Loading branch information
lrochette authored May 31, 2023
1 parent e045baa commit f471605
Show file tree
Hide file tree
Showing 7 changed files with 366 additions and 0 deletions.
7 changes: 7 additions & 0 deletions incubating/argocd-app-status/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM python:3.11.2-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY queries queries/
COPY argocd_app_status.py argocd_app_status.py
CMD [ "python3", "argocd_app_status.py"]
100 changes: 100 additions & 0 deletions incubating/argocd-app-status/argocd_app_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
from gql import Client, gql
from gql.transport.requests import RequestsHTTPTransport
import os
import logging

RUNTIME = os.getenv('RUNTIME')
APPLICATION = os.getenv('APPLICATION')

CF_URL = os.getenv('CF_URL', 'https://g.codefresh.io')
CF_API_KEY = os.getenv('CF_API_KEY')
CF_STEP_NAME= os.getenv('CF_STEP_NAME', 'STEP_NAME')
LOG_LEVEL = os.getenv('LOG_LEVEL', "info")

#######################################################################


def main():
log_format = "%(asctime)s:%(levelname)s:%(name)s.%(funcName)s: %(message)s"
logging.basicConfig(format = log_format, level = LOG_LEVEL.upper())

get_app_status()

## Generating link to the Apps Dashboard
CF_OUTPUT_URL_VAR = CF_STEP_NAME + '_CF_OUTPUT_URL'
link_to_app = get_link_to_apps_dashboard()
export_variable(CF_OUTPUT_URL_VAR, link_to_app)


#######################################################################

def get_query(query_name):
## To do: get query content from a variable, failback to a file
with open('queries/'+query_name+'.graphql', 'r') as file:
query_content = file.read()
return gql(query_content)

def get_runtime():
transport = RequestsHTTPTransport(
url = CF_URL + '/2.0/api/graphql',
headers={'authorization': CF_API_KEY},
verify=True,
retries=3,
)
client = Client(transport=transport, fetch_schema_from_transport=False)
query = get_query('getRuntime') ## gets gql query
variables = {
"runtime": RUNTIME
}
runtime = client.execute(query, variable_values=variables)
return runtime

def get_runtime_ns():
runtime = get_runtime()
runtime_ns = runtime['runtime']['metadata']['namespace']
logging.debug("Runtime Namespace: %", runtime_ns)
return runtime_ns

def get_link_to_apps_dashboard():
runtime_ns= get_runtime_ns()
url_to_app = CF_URL+'/2.0/applications-dashboard/'+RUNTIME+'/'+runtime_ns+'/'+APPLICATION+'/timeline'
return url_to_app

def get_app_status():
gql_api_endpoint = CF_URL + '/2.0/api/graphql'
transport = RequestsHTTPTransport(
url=gql_api_endpoint,
headers={'authorization': CF_API_KEY},
verify=True,
retries=3,
)
client = Client(transport=transport, fetch_schema_from_transport=False)
query = get_query('get_app_status') ## gets gql query
variables = {
"runtime": RUNTIME,
"name": APPLICATION,
"namespace": get_runtime_ns()
}
result = client.execute(query, variable_values=variables)

health = result['application']['healthStatus']
sync = result['application']['syncStatus']
export_variable('HEALTH_STATUS', health)
export_variable('SYNC_STATUS', sync)


def export_variable(var_name, var_value):
path = os.getenv('CF_VOLUME_PATH') if os.getenv('CF_VOLUME_PATH') != None else './'
with open(path+'/env_vars_to_export', 'a') as a_writer:
a_writer.write(var_name + "=" + var_value+'\n')

if os.getenv('CF_VOLUME_PATH') == None: os.mkdir('/meta')
with open('/meta/env_vars_to_export', 'a') as a_writer:
a_writer.write(var_name + "=" + var_value+'\n')

logging.info("Exporting variable: %s=%s", var_name, var_value)

##############################################################

if __name__ == "__main__":
main()
6 changes: 6 additions & 0 deletions incubating/argocd-app-status/env_vars_to_export
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
HEALTH_STATUS=HEALTHY
SYNC_STATUS=SYNCED
STEP_NAME_CF_OUTPUT_URL=https://g.codefresh.io/2.0/applications-dashboard/csdp/csdp/color-dev/timeline
HEALTH_STATUS=HEALTHY
SYNC_STATUS=SYNCED
STEP_NAME_CF_OUTPUT_URL=https://g.codefresh.io/2.0/applications-dashboard/csdp/csdp/color-dev/timeline
10 changes: 10 additions & 0 deletions incubating/argocd-app-status/queries/getRuntime.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
query getRuntime(
$runtime: String!) {
runtime(name: $runtime) {
metadata {
name
namespace
}
ingressHost
}
}
161 changes: 161 additions & 0 deletions incubating/argocd-app-status/queries/get_app_status.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
fragment ApplicationShortOperationStateFragment on ApplicationOperationState {
message
phase
type
syncResult {
revision
source {
repoURL
targetRevision
path
chart
__typename
}
resources {
status
hookPhase
__typename
}
__typename
}
__typename
}

query ApplicationsStatusesQuery(
$runtime: String!
$name: String!
$namespace: String
) {
application(runtime: $runtime, name: $name, namespace: $namespace) {
metadata {
runtime
name
runtime
namespace
created
uid
labels {
key
value
__typename
}
cluster
__typename
}
healthStatus
syncStatus
syncPolicy
isHelmApp
repoURL
revision
updatedAt
size
desiredManifest
appsRelations {
referencedBy {
kind
__typename
}
__typename
}
specSource {
repoURL
targetRevision
path
chart
__typename
}
destination {
name
server
namespace
__typename
}
status {
minHistoryId
__typename
}
source {
gitManifest
path
revision
gitSource {
metadata {
name
__typename
}
self {
repoURL
revision
path
__typename
}
permissions {
read
write
user {
id
__typename
}
__typename
}
__typename
}
__typename
}
errors {
__typename
object {
metadata {
kind
name
namespace
runtime
group
version
__typename
}
__typename
}
level
title
message
lastSeen
... on SyncError {
code
context {
repoURL
revision
path
fileUrl
commitAuthor
commitUrl
commitMessage
commitDate
__typename
}
__typename
}
}
operationState {
...ApplicationShortOperationStateFragment
__typename
}
sync {
status
revision
comparedTo {
source {
repoURL
targetRevision
path
chart
__typename
}
__typename
}
__typename
}
__typename
}
}
6 changes: 6 additions & 0 deletions incubating/argocd-app-status/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
gql==3.4.0
graphql-core==3.2.3
requests==2.28.2
requests-toolbelt==0.10.1
urllib3==1.26.15
multidict==6.0.4
76 changes: 76 additions & 0 deletions incubating/argocd-app-status/step.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
kind: step-type
metadata:
name: argocd-app-status
version: 1.0.1
isPublic: true
description: Get Argo CD App status and return SYNC_STATUS and HEALTH_STATUS
sources:
- 'https://github.com/codefresh-io/steps/tree/master/incubating/argocd-app-status'
stage: incubating
maintainers:
- name: Laurent Rochette
- email: [email protected]
categories:
- GitOps
official: true
tags: []
icon:
type: svg
url: https://cdn.jsdelivr.net/gh/codefresh-io/steps/graduated/argocd-sync/argo.svg
background: "#f4f4f4"
examples:
- description: Get Argo CD app status
workflow:
argocd_app_status:
title: Get Argo CD app status
type: argocd-app-status
arguments:
RUNTIME: my-runtime
APPLICATION: my-app

spec:
arguments: |-
{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"additionalProperties": true,
"patterns": [],
"required": [
"RUNTIME",
"APPLICATION"
],
"properties": {
"RUNTIME": {
"type": "string",
"description": "The name of the GitOps Runtime managing the Argo CD Application"
},
"APPLICATION": {
"type": "string",
"description": "The name of the Argo CD Application to be checked"
},
"IMAGE_NAME": {
"type": "string",
"default": "quay.io/codefreshplugins/argocd-app-status",
"description": "OPTIONAL - To overwrite the image name to use"
},
"IMAGE_TAG": {
"type": "string",
"default": "1.0.1",
"description": "OPTIONAL - To overwrite the tag to use"
}
}
}
stepsTemplate: |-
argocd_app_status:
image: '[[.Arguments.IMAGE_NAME]]:[[.Arguments.IMAGE_TAG]]'
environment:
[[ range $key, $val := .Arguments ]]
- '[[ $key ]]=[[ $val ]]'
[[- end ]]
commands:
- cd /app
- python3 argocd_app_status.py
delimiters:
left: '[['
right: ']]'

0 comments on commit f471605

Please sign in to comment.