Compare commits
	
		
			34 Commits
		
	
	
		
			feat/chart
			...
			95884e14d6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 95884e14d6 | ||
|  | bd58ac1e02 | ||
|  | 9f0218a4da | ||
|  | dfa9fe3f1e | ||
|  | 5d4de618dd | ||
|  | 3481bccc22 | ||
|  | 199209d9f1 | ||
|  | 330e4e9d4a | ||
|  | 6fef803ae9 | ||
|  | 3271246e74 | ||
|  | 80ef56bbc4 | ||
|  | c1134f7403 | ||
|  | 9561dc5493 | ||
|  | 279f93224f | ||
|  | c7f8503fb6 | ||
|  | 4bce096e1f | ||
|  | 75b7b94a50 | ||
|  | 13025746e6 | ||
|  | 550675a4aa | ||
|  | a1af83689d | ||
|  | 53a614bd7e | ||
|  | da9aab90eb | ||
|  | 052e6f1368 | ||
|  | dddd5d1831 | ||
|  | a7a5465a22 | ||
|  | 48301bf82e | ||
|  | d12d3e31bf | ||
|  | 9e267becca | ||
|  | 756638fe21 | ||
|  | 11a4d5cc90 | ||
|  | 26404e5892 | ||
|  | 9cf954776f | ||
|  | 11f56722f7 | ||
|  | 4ae5926b01 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| bin | ||||
| *.base64 | ||||
| env | ||||
| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-catalog | ||||
| description: A Helm chart for deploying the oc-catalog application | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,12 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-oc-catalog | ||||
| spec: | ||||
|   selector: | ||||
|     app: {{ .Chart.Name }} | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.targetPort }} | ||||
|   type: {{ .Values.service.type }} | ||||
| @@ -1,33 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-oc-catalog | ||||
|   labels: | ||||
|     app: oc-catalog | ||||
| spec: | ||||
|   serviceName: "{{ .Release.Name }}-oc-catalog" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: oc-catalog | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: oc-catalog | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: oc-catalog | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: 8080 | ||||
|         env: | ||||
|         - name: MONGO_DATABASE | ||||
|           value: "DC_myDC" | ||||
|         - name: MONGO_URI | ||||
|           value: "mongodb://mongo:27017" | ||||
|       imagePullSecrets: | ||||
|       {{- if .Values.imagePullSecrets }} | ||||
|       {{- range .Values.imagePullSecrets }} | ||||
|         - name: {{ .name }} | ||||
|       {{- end }} | ||||
|       {{- end }} | ||||
| @@ -1,19 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: registry.dev.svc.cluster.local:5000/oc-catalog | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   type: NodePort | ||||
|   port: 8087 | ||||
|   targetPort: 8080 | ||||
|  | ||||
| mongo: | ||||
|   database: DC_myDC | ||||
|   uri: mongodb://mongo:27017 | ||||
|  | ||||
| imagePullSecrets: | ||||
|   - name: regcred | ||||
|  | ||||
| @@ -1,23 +0,0 @@ | ||||
| # Patterns to ignore when building packages. | ||||
| # This supports shell glob matching, relative path matching, and | ||||
| # negation (prefixed with !). Only one pattern per line. | ||||
| .DS_Store | ||||
| # Common VCS dirs | ||||
| .git/ | ||||
| .gitignore | ||||
| .bzr/ | ||||
| .bzrignore | ||||
| .hg/ | ||||
| .hgignore | ||||
| .svn/ | ||||
| # Common backup files | ||||
| *.swp | ||||
| *.bak | ||||
| *.tmp | ||||
| *.orig | ||||
| *~ | ||||
| # Various IDEs | ||||
| .project | ||||
| .idea/ | ||||
| *.tmproj | ||||
| .vscode/ | ||||
| @@ -1,12 +0,0 @@ | ||||
| dependencies: | ||||
| - name: oc-mongo | ||||
|   repository: file://../oc-mongo | ||||
|   version: 0.1.0 | ||||
| - name: oc-mongo-express | ||||
|   repository: file://../oc-mongo-express | ||||
|   version: 0.1.0 | ||||
| - name: oc-catalog | ||||
|   repository: file://../oc-catalog | ||||
|   version: 0.1.0 | ||||
| digest: sha256:036af8acf7fe0a73f039776d13f63aeb7530e7a8b0febb49fd5e8415ac6672c6 | ||||
| generated: "2024-08-27T14:34:41.6038407+02:00" | ||||
| @@ -1,14 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-deploy | ||||
| description: A Helm chart to deploy oc-mongo, oc-mongo-express, and oc-catalog together | ||||
| version: 0.1.0 | ||||
| dependencies: | ||||
|   - name: oc-mongo | ||||
|     version: 0.1.0 | ||||
|     repository: "file://../oc-mongo" | ||||
|   - name: oc-mongo-express | ||||
|     version: 0.1.0 | ||||
|     repository: "file://../oc-mongo-express" | ||||
|   - name: oc-catalog | ||||
|     version: 0.1.0 | ||||
|     repository: "file://../oc-catalog" | ||||
										
											Binary file not shown.
										
									
								
							| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-catalog | ||||
| description: A Helm chart for deploying the oc-catalog application | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,12 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: oc-catalog | ||||
| spec: | ||||
|   selector: | ||||
|     app: {{ .Chart.Name }} | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.targetPort }} | ||||
|   type: {{ .Values.service.type }} | ||||
| @@ -1,33 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-oc-catalog | ||||
|   labels: | ||||
|     app: oc-catalog | ||||
| spec: | ||||
|   serviceName: "oc-catalog" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: oc-catalog | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: oc-catalog | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: oc-catalog | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: 8080 | ||||
|         env: | ||||
|         - name: MONGO_DATABASE | ||||
|           value: "DC_myDC" | ||||
|         - name: MONGO_URI | ||||
|           value: "mongodb://{{ .Release.Name }}-mongo:27017" | ||||
|       imagePullSecrets: | ||||
|       {{- if .Values.imagePullSecrets }} | ||||
|       {{- range .Values.imagePullSecrets }} | ||||
|         - name: {{ .name }} | ||||
|       {{- end }} | ||||
|       {{- end }} | ||||
| @@ -1,19 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: registry.dev.svc.cluster.local:5000/oc-catalog | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   type: NodePort | ||||
|   port: 8087 | ||||
|   targetPort: 8080 | ||||
|  | ||||
| mongo: | ||||
|   database: DC_myDC | ||||
|   uri: mongodb://oc-deploy-mongo:27017 | ||||
|  | ||||
| imagePullSecrets: | ||||
|   - name: regcred | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-mongo-express | ||||
| description: A Helm chart for deploying mongo-express | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,12 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo-express | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo-express | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.targetPort }} | ||||
|   type: {{ .Values.service.type }} | ||||
| @@ -1,39 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo-express | ||||
|   labels: | ||||
|     app: mongo-express | ||||
| spec: | ||||
|   serviceName: "mongo-express" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo-express | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo-express | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo-express | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: {{ .Values.service.targetPort }} | ||||
|         env: | ||||
|         - name: ME_CONFIG_BASICAUTH_USERNAME | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: {{ .Values.secret.usernameKey }} | ||||
|         - name: ME_CONFIG_BASICAUTH_PASSWORD | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: {{ .Values.secret.passwordKey }} | ||||
|       imagePullSecrets: | ||||
|       {{- if .Values.imagePullSecrets }} | ||||
|       {{- range .Values.imagePullSecrets }} | ||||
|         - name: {{ .name }} | ||||
|       {{- end }} | ||||
|       {{- end }} | ||||
| @@ -1,18 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: mongo-express | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   port: 8081 | ||||
|   targetPort: 8081 | ||||
|   type: NodePort | ||||
|  | ||||
| imagePullSecrets: | ||||
|   - name: my-registry-key | ||||
|  | ||||
| secret: | ||||
|   usernameKey: mongo-username | ||||
|   passwordKey: mongo-password | ||||
| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-mongo | ||||
| description: A Helm chart for deploying the oc-mongo component | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,10 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: PersistentVolumeClaim | ||||
| metadata: | ||||
|   name: {{ .Values.persistence.name }} | ||||
| spec: | ||||
|   accessModes: | ||||
|     - {{ .Values.persistence.accessMode }} | ||||
|   resources: | ||||
|     requests: | ||||
|       storage: {{ .Values.persistence.size }} | ||||
| @@ -1,8 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Secret | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo-secret | ||||
| type: Opaque | ||||
| data: | ||||
|   username: {{ .Values.secret.username }} | ||||
|   password: {{ .Values.secret.password }} | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.port }} | ||||
| @@ -1,31 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo | ||||
|   labels: | ||||
|     app: mongo | ||||
| spec: | ||||
|   serviceName: "mongo" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: 27017 | ||||
|         volumeMounts: | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/db | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/configdb | ||||
|       volumes: | ||||
|       - name: mongo-persistent-storage | ||||
|         persistentVolumeClaim: | ||||
|           claimName: {{ .Values.persistence.name }} | ||||
| @@ -1,19 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: mongo | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   port: 27017 | ||||
|  | ||||
| persistence: | ||||
|   name: mongo-pvc-helm | ||||
|   enabled: true | ||||
|   accessMode: ReadWriteOnce | ||||
|   size: 1Gi | ||||
|  | ||||
| secret: | ||||
|   username: dGVzdA==  # base64 encoding of 'test' | ||||
|   password: dGVzdA==  # base64 encoding of 'test' | ||||
| @@ -1,48 +0,0 @@ | ||||
| oc-mongo: | ||||
|   replicaCount: 1 | ||||
|   image: | ||||
|     repository: registry.dev.svc.cluster.local:5000/mongo | ||||
|     tag: latest | ||||
|     pullPolicy: IfNotPresent | ||||
|   service: | ||||
|     port: 27017 | ||||
|   persistence: | ||||
|     name: mongo-pvc-helm | ||||
|     enabled: true | ||||
|     accessMode: ReadWriteOnce | ||||
|     size: 1Gi | ||||
|   secret: | ||||
|     username: dGVzdA==  # base64 encoding of 'test' | ||||
|     password: dGVzdA==  # base64 encoding of 'test' | ||||
|  | ||||
| oc-mongo-express: | ||||
|   replicaCount: 1 | ||||
|   image: | ||||
|     repository: registry.dev.svc.cluster.local:5000/mongo-express | ||||
|     tag: latest | ||||
|     pullPolicy: IfNotPresent | ||||
|   service: | ||||
|     port: 8081 | ||||
|     targetPort: 8081 | ||||
|     type: NodePort | ||||
|   imagePullSecrets: | ||||
|     - name: regcred | ||||
|   secret: | ||||
|     usernameKey: mongo-username | ||||
|     passwordKey: mongo-password | ||||
|  | ||||
| oc-catalog: | ||||
|   replicaCount: 1 | ||||
|   image: | ||||
|     repository: registry.dev.svc.cluster.local:5000/oc-catalog | ||||
|     tag: latest | ||||
|     pullPolicy: IfNotPresent | ||||
|   service: | ||||
|     type: NodePort | ||||
|     port: 8087 | ||||
|     targetPort: 8080 | ||||
|   mongo: | ||||
|     database: DC_myDC | ||||
|     uri: mongodb://oc-catalog-mongo:27017 | ||||
|   imagePullSecrets: | ||||
|     - name: regcred | ||||
| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-mongo-express | ||||
| description: A Helm chart for deploying mongo-express | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,12 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo-express | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo-express | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.targetPort }} | ||||
|   type: {{ .Values.service.type }} | ||||
| @@ -1,39 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo-express | ||||
|   labels: | ||||
|     app: mongo-express | ||||
| spec: | ||||
|   serviceName: "{{ .Release.Name }}-mongo-express" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo-express | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo-express | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo-express | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: {{ .Values.service.targetPort }} | ||||
|         env: | ||||
|         - name: ME_CONFIG_BASICAUTH_USERNAME | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: {{ .Values.secret.usernameKey }} | ||||
|         - name: ME_CONFIG_BASICAUTH_PASSWORD | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: {{ .Values.secret.passwordKey }} | ||||
|       imagePullSecrets: | ||||
|       {{- if .Values.imagePullSecrets }} | ||||
|       {{- range .Values.imagePullSecrets }} | ||||
|         - name: {{ .name }} | ||||
|       {{- end }} | ||||
|       {{- end }} | ||||
| @@ -1,18 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: mongo-express | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   port: 8081 | ||||
|   targetPort: 8081 | ||||
|   type: NodePort | ||||
|  | ||||
| imagePullSecrets: | ||||
|   - name: my-registry-key | ||||
|  | ||||
| secret: | ||||
|   usernameKey: mongo-username | ||||
|   passwordKey: mongo-password | ||||
| @@ -1,5 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: oc-mongo | ||||
| description: A Helm chart for deploying the oc-mongo component | ||||
| version: 0.1.0 | ||||
| appVersion: "1.0" | ||||
| @@ -1,10 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: PersistentVolumeClaim | ||||
| metadata: | ||||
|   name: {{ .Values.persistence.name }} | ||||
| spec: | ||||
|   accessModes: | ||||
|     - {{ .Values.persistence.accessMode }} | ||||
|   resources: | ||||
|     requests: | ||||
|       storage: {{ .Values.persistence.size }} | ||||
| @@ -1,8 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Secret | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo-secret | ||||
| type: Opaque | ||||
| data: | ||||
|   username: {{ .Values.secret.username }} | ||||
|   password: {{ .Values.secret.password }} | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: {{ .Values.service.port }} | ||||
|       targetPort: {{ .Values.service.port }} | ||||
| @@ -1,31 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: StatefulSet | ||||
| metadata: | ||||
|   name: {{ .Release.Name }}-mongo | ||||
|   labels: | ||||
|     app: mongo | ||||
| spec: | ||||
|   serviceName: "{{ .Release.Name }}-mongo" | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo | ||||
|         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|         ports: | ||||
|         - containerPort: 27017 | ||||
|         volumeMounts: | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/db | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/configdb | ||||
|       volumes: | ||||
|       - name: mongo-persistent-storage | ||||
|         persistentVolumeClaim: | ||||
|           claimName: {{ .Values.persistence.name }} | ||||
| @@ -1,19 +0,0 @@ | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: mongo | ||||
|   tag: latest | ||||
|   pullPolicy: IfNotPresent | ||||
|  | ||||
| service: | ||||
|   port: 27017 | ||||
|  | ||||
| persistence: | ||||
|   name: mongo-pvc-helm | ||||
|   enabled: true | ||||
|   accessMode: ReadWriteOnce | ||||
|   size: 1Gi | ||||
|  | ||||
| secret: | ||||
|   username: dGVzdA==  # base64 encoding of 'test' | ||||
|   password: dGVzdA==  # base64 encoding of 'test' | ||||
							
								
								
									
										27
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| #!make | ||||
|  | ||||
| include env | ||||
| export | ||||
|  | ||||
| ifndef OC_VERSION | ||||
| $(error OC_VERSION is not set) | ||||
| endif | ||||
|  | ||||
| ifndef PUBLISH_TOKEN | ||||
| $(error PUBLISH_TOKEN is not set) | ||||
| endif | ||||
|  | ||||
| PUBLISH_REPO := "core/oc-deploy" | ||||
| PUBLISH_BRANCH := main | ||||
|  | ||||
| .PHONY: publish | ||||
| publish: | ||||
| 	@echo Publication de : ${OC_VERSION} | ||||
| 	@(cd publish && \ | ||||
|         PUBLISH_REPO=${PUBLISH_REPO} \ | ||||
|         PUBLISH_TOKEN=${PUBLISH_TOKEN} \ | ||||
|         PUBLISH_BRANCH=${PUBLISH_BRANCH} \ | ||||
|         go run main.go ${OC_VERSION}) | ||||
|  | ||||
| clean: | ||||
| 	@rm *.base64 | ||||
							
								
								
									
										110
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								README.md
									
									
									
									
									
								
							| @@ -4,36 +4,114 @@ The purpose of oc-deploy, is to deploy all the OC components over a Kubernetes c | ||||
|  | ||||
| An OpenCloud deployment is composed of the following layers:  | ||||
|  | ||||
| OpenCloud components | <-- TODO | ||||
| -------------------------- | ||||
| KubernetesCluster | <-- TODO | ||||
| --------------------------  | ||||
| IaaS (VMs, LAN) | <-- pre-requisite | ||||
| -------------------------- | ||||
| HW (network and servers) | <-- pre-requisite | ||||
| -------------------------- | ||||
|  | ||||
| | Layer                    | Tool                  | | ||||
| | ------------------------ | --------------------- | | ||||
| | OpenCloud components     | oc-deploy binary      | | ||||
| | KubernetesCluster        | TODO or pre-requisite | | ||||
| | IaaS (VMs, LAN)          | pre-requisite         | | ||||
| | HW (network and servers) | <-- pre-requisite     | | ||||
|  | ||||
|  | ||||
| It thus contains a first optional installation layer which deploys the Kubernetes nodes (control plane(s) and workers) above an existing infrastructure (Iaas). | ||||
|  | ||||
| Then the second installation layer uses Helm charts to deploy and configure all the OC components. | ||||
|  | ||||
| This documentation will be updated with the needed command and/or requirements to properly execute the installation. | ||||
|  | ||||
| # Deploy cluster | ||||
| ## For dev in Docker | ||||
| Install brew | ||||
|  | ||||
| # oc-deploy tools | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| | Command                                                                       | Description                 | | ||||
| | ----------------------------------------------------------------------------- | --------------------------- | | ||||
| | ```oc-deploy```                                                               | Display help                | | ||||
| | ```oc-deploy version```                                                       | Display the version of tool | | ||||
| | ```oc-deploy install [-c\|--context <context>] [-v\|--version <OcVersion>]``` | Deploy an OpenCloud         | | ||||
| | ```oc-deploy uninstall [-c\|--context <context>]```                           | Undeploy an OpenCloud       | | ||||
|  | ||||
| | Arguments        | Description                 | Default      | | ||||
| | ---------------- | --------------------------- | ------------ | | ||||
| | ```context```    | Context Kubernetes          |  _opencloud_ | | ||||
| | ```OcVersion```  | Specific version or latest  | _latest_     | | ||||
|  | ||||
| ## Principe | ||||
|  | ||||
| * Download an "OpenCloud file version" : oc_<version>.yml from relase on GitEa (core/oc-version). | ||||
| * Initialise an workspace direcotry : ./workspace_<contextK8S> | ||||
| * Install tools as describe, if not found on the path : | ||||
|   * Helm | ||||
|   * Kubectl | ||||
| * Check if the Cluster (context) is available | ||||
| * Install all charts as describe : | ||||
|   * Charts : from Harbor or local | ||||
|   * Images : from Harbor or local | ||||
| * Check if componants are available | ||||
|  | ||||
| ## Pre-requis | ||||
|  | ||||
| **oc-deploy** need to access to an Kubernetes Cluster, c'est-à-dire : kubeconfig. | ||||
|  | ||||
| **oc-deploy** need to access to Internet : | ||||
|  | ||||
| * to download the _oc.json_ file (contient _oc.yml_) : | ||||
|   * Url : https://cloud.o-forge.io/core/oc-deploy/releases | ||||
| * to download _kubectl_ and _helm_ tools if | ||||
|   * Url : Urls are specified into _oc.yml_ | ||||
|  | ||||
| ## Dev | ||||
|  | ||||
| Cf. src/README.md | ||||
|  | ||||
| ## Publish | ||||
|  | ||||
| Publish in the relase GitEa the binary (the binary is base64 coding). | ||||
|  | ||||
| Set **env** file to overwrite varibable as : | ||||
|  | ||||
|     #!make | ||||
|     PUBLISH_TOKEN = <gitea_token> | ||||
|  | ||||
| To publish : | ||||
|  | ||||
|     OC_VERSION = <x.y.z> make publish | ||||
|   | ||||
| # Installation on Kubernetes | ||||
|  | ||||
| ## Minikube | ||||
|  | ||||
| TO DO | ||||
|  | ||||
| ## Kubernetes | ||||
|  | ||||
| TO DO | ||||
|  | ||||
| ## RKE2 | ||||
|  | ||||
| TO DO | ||||
|  | ||||
| ## OpenShift | ||||
|  | ||||
| TO DO | ||||
|  | ||||
| # Installation on Docker  | ||||
|  | ||||
| Without Kubernetes, for dev in Docker | ||||
|  | ||||
| ## Install brew | ||||
|  | ||||
|     /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" | ||||
|  | ||||
| Install Talos | ||||
| ## Install Talos | ||||
|  | ||||
|     brew install siderolabs/tap/talosctl | ||||
|     talosctl cluster create | ||||
| # Install helm | ||||
| ## Install helm | ||||
|     curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | ||||
|     chmod 700 get_helm.sh | ||||
|     ./get_helm.sh | ||||
|  | ||||
| # Create OpenCloud Chart | ||||
| ## Create OpenCloud Chart  | ||||
|  | ||||
| Obsolete : use oc-deploy tool | ||||
|  | ||||
|     helm create occhart | ||||
|   | ||||
| @@ -1,53 +0,0 @@ | ||||
| @startuml | ||||
|  | ||||
| top to bottom direction | ||||
|  | ||||
| component front as "oc-front" #MistyRose | ||||
|  | ||||
| component api as "oc-api" #BlueViolet | ||||
| component auth as "oc-auth" #BlueViolet | ||||
|  | ||||
| component catalog as "oc-catalog" #MistyRose | ||||
| component workspace as "oc-workspace" #MistyRose | ||||
| component workflow as "oc-workflow" #MistyRose | ||||
| component calendarIn as "oc-calendar-in" #MistyRose | ||||
| component calendarOut as "oc-calendar-out" #MistyRose | ||||
| component stat as "oc-status" #MistyRose | ||||
|  | ||||
| component disco as "oc-discovery" #MistyRose | ||||
| component agg as "oc-aggregator" #MistyRose | ||||
|  | ||||
| component scheduler as "oc-scheduler" #LightYellow | ||||
| component monitor as "oc-monitor" #LightYellow | ||||
|  | ||||
| database rd as "Nats" #Green | ||||
| database zn as "Zinc" #Green | ||||
| database loki as "Loki" #Green | ||||
| database mongo as "MongoDB" #Green | ||||
| database nats as "Nats" #Green | ||||
|  | ||||
| front -- api | ||||
|  | ||||
| api -- auth : auth user | ||||
| api -- catalog : local search | ||||
| api -- workspace : store user data | ||||
| api -- workflow | ||||
| api -- calendarIn | ||||
| api -- calendarOut | ||||
| api -- stat | ||||
|  | ||||
| catalog -- disco | ||||
| catalog -- agg | ||||
|  | ||||
| scheduler -- monitor | ||||
| scheduler -- catalog | ||||
|  | ||||
| rd -- scheduler | ||||
| loki -- monitor | ||||
|  | ||||
| catalog -- mongo  : store resources available for users | ||||
| workspace -- mongo  : store resources allocated to a workspace | ||||
| workflow -- mongo  : store workflow  | ||||
| calendarOut -- mongo  : store booking informations for this dc | ||||
|  | ||||
| @enduml | ||||
| @@ -1,88 +0,0 @@ | ||||
| version: '3.8' | ||||
|  | ||||
| services: | ||||
|   traefik: | ||||
|     image: traefik:latest | ||||
|     command: | ||||
|       - "--api.insecure=true" | ||||
|       - "--providers.docker=true" | ||||
|       - "--entrypoints.web.address=:80" | ||||
|     ports: | ||||
|       - "80:80" | ||||
|       - "8080:8080" | ||||
|     volumes: | ||||
|       - /var/run/docker.sock:/var/run/docker.sock | ||||
|  | ||||
|   mongo: | ||||
|     image: mongo:latest | ||||
|     ports: | ||||
|       - "27017:27017" | ||||
|     volumes: | ||||
|       - mongo-data:/data/db | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.mongo.rule=PathPrefix(`/mongo`)" | ||||
|       - "traefik.http.services.mongo.loadbalancer.server.port=27017" | ||||
|  | ||||
|   nats: | ||||
|     image: nats:latest | ||||
|     ports: | ||||
|       - "4222:4222" | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.nats.rule=PathPrefix(`/nats`)" | ||||
|       - "traefik.http.services.nats.loadbalancer.server.port=4222" | ||||
|  | ||||
|   zinc: | ||||
|     image: public.ecr.aws/zinclabs/zincsearch:latest | ||||
|     ports: | ||||
|       - "4080:4080" | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.zinc.rule=PathPrefix(`/zinc`)" | ||||
|       - "traefik.http.services.zinc.loadbalancer.server.port=4080" | ||||
|  | ||||
|   dex: | ||||
|     image: quay.io/dexidp/dex:latest | ||||
|     ports: | ||||
|       - "5556:5556" | ||||
|     volumes: | ||||
|       - ./dex/config.yaml:/etc/dex/cfg/config.yaml | ||||
|     command: ["dex", "serve", "/etc/dex/cfg/config.yaml"] | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.dex.rule=PathPrefix(`/dex`)" | ||||
|       - "traefik.http.services.dex.loadbalancer.server.port=5556" | ||||
|  | ||||
|   ldap: | ||||
|     image: bitnami/openldap | ||||
|     ports: | ||||
|       - "389:389" | ||||
|     environment: | ||||
|       - LDAP_ADMIN_USERNAME=admin | ||||
|       - LDAP_ADMIN_PASSWORD=adminpassword | ||||
|       - LDAP_USERS=user01,user02 | ||||
|       - LDAP_PASSWORDS=password1,password2 | ||||
|  | ||||
|   grafana: | ||||
|     image: grafana/grafana:latest | ||||
|     ports: | ||||
|       - "3000:3000" | ||||
|     environment: | ||||
|       GF_SECURITY_ADMIN_PASSWORD: "admin" | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.grafana.rule=PathPrefix(`/grafana`)" | ||||
|       - "traefik.http.services.grafana.loadbalancer.server.port=3000" | ||||
|  | ||||
|   loki: | ||||
|     image: grafana/loki:latest | ||||
|     ports: | ||||
|       - "3100:3100" | ||||
|     labels: | ||||
|       - "traefik.enable=true" | ||||
|       - "traefik.http.routers.loki.rule=PathPrefix(`/loki`)" | ||||
|       - "traefik.http.services.loki.loadbalancer.server.port=3100" | ||||
|  | ||||
| volumes: | ||||
|   mongo-data: | ||||
| @@ -1,23 +0,0 @@ | ||||
| # Patterns to ignore when building packages. | ||||
| # This supports shell glob matching, relative path matching, and | ||||
| # negation (prefixed with !). Only one pattern per line. | ||||
| .DS_Store | ||||
| # Common VCS dirs | ||||
| .git/ | ||||
| .gitignore | ||||
| .bzr/ | ||||
| .bzrignore | ||||
| .hg/ | ||||
| .hgignore | ||||
| .svn/ | ||||
| # Common backup files | ||||
| *.swp | ||||
| *.bak | ||||
| *.tmp | ||||
| *.orig | ||||
| *~ | ||||
| # Various IDEs | ||||
| .project | ||||
| .idea/ | ||||
| *.tmproj | ||||
| .vscode/ | ||||
| @@ -1,24 +0,0 @@ | ||||
| apiVersion: v2 | ||||
| name: occhart | ||||
| description: A Helm chart for Kubernetes | ||||
|  | ||||
| # A chart can be either an 'application' or a 'library' chart. | ||||
| # | ||||
| # Application charts are a collection of templates that can be packaged into versioned archives | ||||
| # to be deployed. | ||||
| # | ||||
| # Library charts provide useful utilities or functions for the chart developer. They're included as | ||||
| # a dependency of application charts to inject those utilities and functions into the rendering | ||||
| # pipeline. Library charts do not define any templates and therefore cannot be deployed. | ||||
| type: application | ||||
|  | ||||
| # This is the chart version. This version number should be incremented each time you make changes | ||||
| # to the chart and its templates, including the app version. | ||||
| # Versions are expected to follow Semantic Versioning (https://semver.org/) | ||||
| version: 0.1.0 | ||||
|  | ||||
| # This is the version number of the application being deployed. This version number should be | ||||
| # incremented each time you make changes to the application. Versions are not expected to | ||||
| # follow Semantic Versioning. They should reflect the version the application is using. | ||||
| # It is recommended to use it with quotes. | ||||
| appVersion: "1.16.0" | ||||
| @@ -1,32 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: dex | ||||
|   labels: | ||||
|     app: dex | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: dex | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: dex | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: dex | ||||
|           image: quay.io/dexidp/dex:v2.27.0 | ||||
|           ports: | ||||
|             - containerPort: 5556 | ||||
|           args: | ||||
|             - serve | ||||
|             - /etc/dex/cfg/config.yaml | ||||
|           volumeMounts: | ||||
|             - mountPath: /etc/dex/cfg | ||||
|               name: config | ||||
|       volumes: | ||||
|         - name: config | ||||
|           configMap: | ||||
|             name: dex-config | ||||
|    | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: dex | ||||
|   labels: | ||||
|     app: dex | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 5556 | ||||
|   selector: | ||||
|     app: dex | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: grafana | ||||
|   labels: | ||||
|     app: grafana | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: grafana | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: grafana | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: grafana | ||||
|           image: grafana/grafana:7.5.0 | ||||
|           ports: | ||||
|             - containerPort: 3000 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: grafana | ||||
|   labels: | ||||
|     app: grafana | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 3000 | ||||
|   selector: | ||||
|     app: grafana | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: ldap | ||||
|   labels: | ||||
|     app: ldap | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: ldap | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: ldap | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: ldap | ||||
|           image: osixia/openldap:1.5.0 | ||||
|           ports: | ||||
|             - containerPort: 389 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: ldap | ||||
|   labels: | ||||
|     app: ldap | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 389 | ||||
|   selector: | ||||
|     app: ldap | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: loki | ||||
|   labels: | ||||
|     app: loki | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: loki | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: loki | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: loki | ||||
|           image: grafana/loki:2.2.0 | ||||
|           ports: | ||||
|             - containerPort: 3100 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: loki | ||||
|   labels: | ||||
|     app: loki | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 3100 | ||||
|   selector: | ||||
|     app: loki | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: mongo | ||||
|   labels: | ||||
|     app: mongo | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: mongo | ||||
|           image: mongo:4.4 | ||||
|           ports: | ||||
|             - containerPort: 27017 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo | ||||
|   labels: | ||||
|     app: mongo | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 27017 | ||||
|   selector: | ||||
|     app: mongo | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: nats | ||||
|   labels: | ||||
|     app: nats | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: nats | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: nats | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: nats | ||||
|           image: nats:2.1.9 | ||||
|           ports: | ||||
|             - containerPort: 4222 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: nats | ||||
|   labels: | ||||
|     app: nats | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 4222 | ||||
|   selector: | ||||
|     app: nats | ||||
| @@ -1,37 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: traefik | ||||
|   labels: | ||||
|     app: traefik | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: traefik | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: traefik | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: traefik | ||||
|           image: traefik:v2.4 | ||||
|           ports: | ||||
|             - name: web | ||||
|               containerPort: 80 | ||||
|             - name: admin | ||||
|               containerPort: 8080 | ||||
|           args: | ||||
|             - --entrypoints.web.address=:80 | ||||
|             - --entrypoints.websecure.address=:443 | ||||
|             - --providers.kubernetescrd | ||||
|             - --api | ||||
|           volumeMounts: | ||||
|             - mountPath: /etc/traefik | ||||
|               name: traefik-config | ||||
|       volumes: | ||||
|         - name: traefik-config | ||||
|           configMap: | ||||
|             name: traefik-config | ||||
|  | ||||
| @@ -1,81 +0,0 @@ | ||||
| apiVersion: networking.k8s.io/v1 | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: traefik-ingress | ||||
|   annotations: | ||||
|     traefik.ingress.kubernetes.io/router.entrypoints: web | ||||
| spec: | ||||
|   rules: | ||||
|     - host: <your-domain> | ||||
|       http: | ||||
|         paths: | ||||
|           - path: /front | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: front-service | ||||
|                 port: | ||||
|                   number: 80 | ||||
|           - path: /back1 | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: back1-service | ||||
|                 port: | ||||
|                   number: 80 | ||||
|           - path: /back2 | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: back2-service | ||||
|                 port: | ||||
|                   number: 80 | ||||
|           - path: /mongo | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: mongo | ||||
|                 port: | ||||
|                   number: 27017 | ||||
|           - path: /nats | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: nats | ||||
|                 port: | ||||
|                   number: 4222 | ||||
|           - path: /zinc | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: zinc | ||||
|                 port: | ||||
|                   number: 4080 | ||||
|           - path: /dex | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: dex | ||||
|                 port: | ||||
|                   number: 5556 | ||||
|           - path: /ldap | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: ldap | ||||
|                 port: | ||||
|                   number: 389 | ||||
|           - path: /grafana | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: grafana | ||||
|                 port: | ||||
|                   number: 3000 | ||||
|           - path: /loki | ||||
|             pathType: Prefix | ||||
|             backend: | ||||
|               service: | ||||
|                 name: loki | ||||
|                 port: | ||||
|                   number: 3100 | ||||
| @@ -1,17 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: traefik | ||||
|   labels: | ||||
|     app: traefik | ||||
| spec: | ||||
|   type: LoadBalancer | ||||
|   ports: | ||||
|     - port: 80 | ||||
|       name: web | ||||
|       targetPort: 80 | ||||
|     - port: 8080 | ||||
|       name: admin | ||||
|       targetPort: 8080 | ||||
|   selector: | ||||
|     app: traefik | ||||
| @@ -1,21 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: zinc | ||||
|   labels: | ||||
|     app: zinc | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: zinc | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: zinc | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: zinc | ||||
|           image: public.ecr.aws/zinclabs/zinc:latest | ||||
|           ports: | ||||
|             - containerPort: 4080 | ||||
| @@ -1,11 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: zinc | ||||
|   labels: | ||||
|     app: zinc | ||||
| spec: | ||||
|   ports: | ||||
|     - port: 4080 | ||||
|   selector: | ||||
|     app: zinc | ||||
| @@ -1,22 +0,0 @@ | ||||
| 1. Get the application URL by running these commands: | ||||
| {{- if .Values.ingress.enabled }} | ||||
| {{- range $host := .Values.ingress.hosts }} | ||||
|   {{- range .paths }} | ||||
|   http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} | ||||
|   {{- end }} | ||||
| {{- end }} | ||||
| {{- else if contains "NodePort" .Values.service.type }} | ||||
|   export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "occhart.fullname" . }}) | ||||
|   export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") | ||||
|   echo http://$NODE_IP:$NODE_PORT | ||||
| {{- else if contains "LoadBalancer" .Values.service.type }} | ||||
|      NOTE: It may take a few minutes for the LoadBalancer IP to be available. | ||||
|            You can watch its status by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "occhart.fullname" . }}' | ||||
|   export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "occhart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") | ||||
|   echo http://$SERVICE_IP:{{ .Values.service.port }} | ||||
| {{- else if contains "ClusterIP" .Values.service.type }} | ||||
|   export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "occhart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") | ||||
|   export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") | ||||
|   echo "Visit http://127.0.0.1:8080 to use your application" | ||||
|   kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT | ||||
| {{- end }} | ||||
| @@ -1,62 +0,0 @@ | ||||
| {{/* | ||||
| Expand the name of the chart. | ||||
| */}} | ||||
| {{- define "occhart.name" -}} | ||||
| {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} | ||||
| {{- end }} | ||||
|  | ||||
| {{/* | ||||
| Create a default fully qualified app name. | ||||
| We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). | ||||
| If release name contains chart name it will be used as a full name. | ||||
| */}} | ||||
| {{- define "occhart.fullname" -}} | ||||
| {{- if .Values.fullnameOverride }} | ||||
| {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} | ||||
| {{- else }} | ||||
| {{- $name := default .Chart.Name .Values.nameOverride }} | ||||
| {{- if contains $name .Release.Name }} | ||||
| {{- .Release.Name | trunc 63 | trimSuffix "-" }} | ||||
| {{- else }} | ||||
| {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} | ||||
| {{- end }} | ||||
| {{- end }} | ||||
| {{- end }} | ||||
|  | ||||
| {{/* | ||||
| Create chart name and version as used by the chart label. | ||||
| */}} | ||||
| {{- define "occhart.chart" -}} | ||||
| {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} | ||||
| {{- end }} | ||||
|  | ||||
| {{/* | ||||
| Common labels | ||||
| */}} | ||||
| {{- define "occhart.labels" -}} | ||||
| helm.sh/chart: {{ include "occhart.chart" . }} | ||||
| {{ include "occhart.selectorLabels" . }} | ||||
| {{- if .Chart.AppVersion }} | ||||
| app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} | ||||
| {{- end }} | ||||
| app.kubernetes.io/managed-by: {{ .Release.Service }} | ||||
| {{- end }} | ||||
|  | ||||
| {{/* | ||||
| Selector labels | ||||
| */}} | ||||
| {{- define "occhart.selectorLabels" -}} | ||||
| app.kubernetes.io/name: {{ include "occhart.name" . }} | ||||
| app.kubernetes.io/instance: {{ .Release.Name }} | ||||
| {{- end }} | ||||
|  | ||||
| {{/* | ||||
| Create the name of the service account to use | ||||
| */}} | ||||
| {{- define "occhart.serviceAccountName" -}} | ||||
| {{- if .Values.serviceAccount.create }} | ||||
| {{- default (include "occhart.fullname" .) .Values.serviceAccount.name }} | ||||
| {{- else }} | ||||
| {{- default "default" .Values.serviceAccount.name }} | ||||
| {{- end }} | ||||
| {{- end }} | ||||
| @@ -1,68 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: {{ include "occhart.fullname" . }} | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
| spec: | ||||
|   {{- if not .Values.autoscaling.enabled }} | ||||
|   replicas: {{ .Values.replicaCount }} | ||||
|   {{- end }} | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       {{- include "occhart.selectorLabels" . | nindent 6 }} | ||||
|   template: | ||||
|     metadata: | ||||
|       {{- with .Values.podAnnotations }} | ||||
|       annotations: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       labels: | ||||
|         {{- include "occhart.labels" . | nindent 8 }} | ||||
|         {{- with .Values.podLabels }} | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|         {{- end }} | ||||
|     spec: | ||||
|       {{- with .Values.imagePullSecrets }} | ||||
|       imagePullSecrets: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       serviceAccountName: {{ include "occhart.serviceAccountName" . }} | ||||
|       securityContext: | ||||
|         {{- toYaml .Values.podSecurityContext | nindent 8 }} | ||||
|       containers: | ||||
|         - name: {{ .Chart.Name }} | ||||
|           securityContext: | ||||
|             {{- toYaml .Values.securityContext | nindent 12 }} | ||||
|           image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" | ||||
|           imagePullPolicy: {{ .Values.image.pullPolicy }} | ||||
|           ports: | ||||
|             - name: http | ||||
|               containerPort: {{ .Values.service.port }} | ||||
|               protocol: TCP | ||||
|           livenessProbe: | ||||
|             {{- toYaml .Values.livenessProbe | nindent 12 }} | ||||
|           readinessProbe: | ||||
|             {{- toYaml .Values.readinessProbe | nindent 12 }} | ||||
|           resources: | ||||
|             {{- toYaml .Values.resources | nindent 12 }} | ||||
|           {{- with .Values.volumeMounts }} | ||||
|           volumeMounts: | ||||
|             {{- toYaml . | nindent 12 }} | ||||
|           {{- end }} | ||||
|       {{- with .Values.volumes }} | ||||
|       volumes: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       {{- with .Values.nodeSelector }} | ||||
|       nodeSelector: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       {{- with .Values.affinity }} | ||||
|       affinity: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
|       {{- with .Values.tolerations }} | ||||
|       tolerations: | ||||
|         {{- toYaml . | nindent 8 }} | ||||
|       {{- end }} | ||||
| @@ -1,32 +0,0 @@ | ||||
| {{- if .Values.autoscaling.enabled }} | ||||
| apiVersion: autoscaling/v2 | ||||
| kind: HorizontalPodAutoscaler | ||||
| metadata: | ||||
|   name: {{ include "occhart.fullname" . }} | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
| spec: | ||||
|   scaleTargetRef: | ||||
|     apiVersion: apps/v1 | ||||
|     kind: Deployment | ||||
|     name: {{ include "occhart.fullname" . }} | ||||
|   minReplicas: {{ .Values.autoscaling.minReplicas }} | ||||
|   maxReplicas: {{ .Values.autoscaling.maxReplicas }} | ||||
|   metrics: | ||||
|     {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} | ||||
|     - type: Resource | ||||
|       resource: | ||||
|         name: cpu | ||||
|         target: | ||||
|           type: Utilization | ||||
|           averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} | ||||
|     {{- end }} | ||||
|     {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} | ||||
|     - type: Resource | ||||
|       resource: | ||||
|         name: memory | ||||
|         target: | ||||
|           type: Utilization | ||||
|           averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} | ||||
|     {{- end }} | ||||
| {{- end }} | ||||
| @@ -1,61 +0,0 @@ | ||||
| {{- if .Values.ingress.enabled -}} | ||||
| {{- $fullName := include "occhart.fullname" . -}} | ||||
| {{- $svcPort := .Values.service.port -}} | ||||
| {{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} | ||||
|   {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} | ||||
|   {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} | ||||
|   {{- end }} | ||||
| {{- end }} | ||||
| {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} | ||||
| apiVersion: networking.k8s.io/v1 | ||||
| {{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} | ||||
| apiVersion: networking.k8s.io/v1beta1 | ||||
| {{- else -}} | ||||
| apiVersion: extensions/v1beta1 | ||||
| {{- end }} | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: {{ $fullName }} | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
|   {{- with .Values.ingress.annotations }} | ||||
|   annotations: | ||||
|     {{- toYaml . | nindent 4 }} | ||||
|   {{- end }} | ||||
| spec: | ||||
|   {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} | ||||
|   ingressClassName: {{ .Values.ingress.className }} | ||||
|   {{- end }} | ||||
|   {{- if .Values.ingress.tls }} | ||||
|   tls: | ||||
|     {{- range .Values.ingress.tls }} | ||||
|     - hosts: | ||||
|         {{- range .hosts }} | ||||
|         - {{ . | quote }} | ||||
|         {{- end }} | ||||
|       secretName: {{ .secretName }} | ||||
|     {{- end }} | ||||
|   {{- end }} | ||||
|   rules: | ||||
|     {{- range .Values.ingress.hosts }} | ||||
|     - host: {{ .host | quote }} | ||||
|       http: | ||||
|         paths: | ||||
|           {{- range .paths }} | ||||
|           - path: {{ .path }} | ||||
|             {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} | ||||
|             pathType: {{ .pathType }} | ||||
|             {{- end }} | ||||
|             backend: | ||||
|               {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} | ||||
|               service: | ||||
|                 name: {{ $fullName }} | ||||
|                 port: | ||||
|                   number: {{ $svcPort }} | ||||
|               {{- else }} | ||||
|               serviceName: {{ $fullName }} | ||||
|               servicePort: {{ $svcPort }} | ||||
|               {{- end }} | ||||
|           {{- end }} | ||||
|     {{- end }} | ||||
| {{- end }} | ||||
| @@ -1,15 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: {{ include "occhart.fullname" . }} | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
| spec: | ||||
|   type: {{ .Values.service.type }} | ||||
|   ports: | ||||
|     - port: {{ .Values.service.port }} | ||||
|       targetPort: http | ||||
|       protocol: TCP | ||||
|       name: http | ||||
|   selector: | ||||
|     {{- include "occhart.selectorLabels" . | nindent 4 }} | ||||
| @@ -1,13 +0,0 @@ | ||||
| {{- if .Values.serviceAccount.create -}} | ||||
| apiVersion: v1 | ||||
| kind: ServiceAccount | ||||
| metadata: | ||||
|   name: {{ include "occhart.serviceAccountName" . }} | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
|   {{- with .Values.serviceAccount.annotations }} | ||||
|   annotations: | ||||
|     {{- toYaml . | nindent 4 }} | ||||
|   {{- end }} | ||||
| automountServiceAccountToken: {{ .Values.serviceAccount.automount }} | ||||
| {{- end }} | ||||
| @@ -1,15 +0,0 @@ | ||||
| apiVersion: v1 | ||||
| kind: Pod | ||||
| metadata: | ||||
|   name: "{{ include "occhart.fullname" . }}-test-connection" | ||||
|   labels: | ||||
|     {{- include "occhart.labels" . | nindent 4 }} | ||||
|   annotations: | ||||
|     "helm.sh/hook": test | ||||
| spec: | ||||
|   containers: | ||||
|     - name: wget | ||||
|       image: busybox | ||||
|       command: ['wget'] | ||||
|       args: ['{{ include "occhart.fullname" . }}:{{ .Values.service.port }}'] | ||||
|   restartPolicy: Never | ||||
| @@ -1,107 +0,0 @@ | ||||
| # Default values for occhart. | ||||
| # This is a YAML-formatted file. | ||||
| # Declare variables to be passed into your templates. | ||||
|  | ||||
| replicaCount: 1 | ||||
|  | ||||
| image: | ||||
|   repository: nginx | ||||
|   pullPolicy: IfNotPresent | ||||
|   # Overrides the image tag whose default is the chart appVersion. | ||||
|   tag: "" | ||||
|  | ||||
| imagePullSecrets: [] | ||||
| nameOverride: "" | ||||
| fullnameOverride: "" | ||||
|  | ||||
| serviceAccount: | ||||
|   # Specifies whether a service account should be created | ||||
|   create: true | ||||
|   # Automatically mount a ServiceAccount's API credentials? | ||||
|   automount: true | ||||
|   # Annotations to add to the service account | ||||
|   annotations: {} | ||||
|   # The name of the service account to use. | ||||
|   # If not set and create is true, a name is generated using the fullname template | ||||
|   name: "" | ||||
|  | ||||
| podAnnotations: {} | ||||
| podLabels: {} | ||||
|  | ||||
| podSecurityContext: {} | ||||
|   # fsGroup: 2000 | ||||
|  | ||||
| securityContext: {} | ||||
|   # capabilities: | ||||
|   #   drop: | ||||
|   #   - ALL | ||||
|   # readOnlyRootFilesystem: true | ||||
|   # runAsNonRoot: true | ||||
|   # runAsUser: 1000 | ||||
|  | ||||
| service: | ||||
|   type: ClusterIP | ||||
|   port: 80 | ||||
|  | ||||
| ingress: | ||||
|   enabled: false | ||||
|   className: "" | ||||
|   annotations: {} | ||||
|     # kubernetes.io/ingress.class: nginx | ||||
|     # kubernetes.io/tls-acme: "true" | ||||
|   hosts: | ||||
|     - host: chart-example.local | ||||
|       paths: | ||||
|         - path: / | ||||
|           pathType: ImplementationSpecific | ||||
|   tls: [] | ||||
|   #  - secretName: chart-example-tls | ||||
|   #    hosts: | ||||
|   #      - chart-example.local | ||||
|  | ||||
| resources: {} | ||||
|   # We usually recommend not to specify default resources and to leave this as a conscious | ||||
|   # choice for the user. This also increases chances charts run on environments with little | ||||
|   # resources, such as Minikube. If you do want to specify resources, uncomment the following | ||||
|   # lines, adjust them as necessary, and remove the curly braces after 'resources:'. | ||||
|   # limits: | ||||
|   #   cpu: 100m | ||||
|   #   memory: 128Mi | ||||
|   # requests: | ||||
|   #   cpu: 100m | ||||
|   #   memory: 128Mi | ||||
|  | ||||
| livenessProbe: | ||||
|   httpGet: | ||||
|     path: / | ||||
|     port: http | ||||
| readinessProbe: | ||||
|   httpGet: | ||||
|     path: / | ||||
|     port: http | ||||
|  | ||||
| autoscaling: | ||||
|   enabled: false | ||||
|   minReplicas: 1 | ||||
|   maxReplicas: 100 | ||||
|   targetCPUUtilizationPercentage: 80 | ||||
|   # targetMemoryUtilizationPercentage: 80 | ||||
|  | ||||
| # Additional volumes on the output Deployment definition. | ||||
| volumes: [] | ||||
| # - name: foo | ||||
| #   secret: | ||||
| #     secretName: mysecret | ||||
| #     optional: false | ||||
|  | ||||
| # Additional volumeMounts on the output Deployment definition. | ||||
| volumeMounts: [] | ||||
| # - name: foo | ||||
| #   mountPath: "/etc/foo" | ||||
| #   readOnly: true | ||||
|  | ||||
| nodeSelector: {} | ||||
|  | ||||
| tolerations: [] | ||||
|  | ||||
| affinity: {} | ||||
| @@ -1,29 +0,0 @@ | ||||
| # oc-catalog-deployment.yml | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: oc-catalog | ||||
|   labels: | ||||
|     app: oc-catalog | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: oc-catalog | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: oc-catalog | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: oc-catalog | ||||
|         image: registry.dev.svc.cluster.local:5000/oc-catalog:latest | ||||
|         ports: | ||||
|         - containerPort: 8080 | ||||
|         env: | ||||
|         - name: MONGO_DATABASE | ||||
|           value: "DC_myDC" | ||||
|         - name: MONGO_URI | ||||
|           value: "mongodb://mongo:27017" | ||||
|       imagePullSecrets: | ||||
|       - name: regcred | ||||
| @@ -1,13 +0,0 @@ | ||||
| # oc-catalog-service.yml | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: oc-catalog | ||||
| spec: | ||||
|   selector: | ||||
|     app: oc-catalog | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: 8087 | ||||
|       targetPort: 8080 | ||||
|   type: NodePort  # Optional, useful for accessing via Minikube IP and NodePort | ||||
| @@ -1,32 +0,0 @@ | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: mongo-express | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo-express | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo-express | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo-express | ||||
|         image: mongo-express:latest | ||||
|         ports: | ||||
|         - containerPort: 8081 | ||||
|         env: | ||||
|         - name: ME_CONFIG_BASICAUTH_USERNAME | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: mongo-username | ||||
|         - name: ME_CONFIG_BASICAUTH_PASSWORD | ||||
|           valueFrom: | ||||
|             secretKeyRef: | ||||
|               name: mongo-secret | ||||
|               key: mongo-password | ||||
|       imagePullSecrets: | ||||
|       - name: my-registry-key | ||||
| @@ -1,13 +0,0 @@ | ||||
| # mongo-express-service.yml | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo-express | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo-express | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: 8081 | ||||
|       targetPort: 8081 | ||||
|   type: NodePort  # Optional, useful for accessing via Minikube IP and NodePort | ||||
| @@ -1,42 +0,0 @@ | ||||
| # mongo-deployment.yml | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: mongo | ||||
|   labels: | ||||
|     app: mongo | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: mongo | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: mongo | ||||
|     spec: | ||||
|       containers: | ||||
|       - name: mongo | ||||
|         image: mongo:latest | ||||
|         ports: | ||||
|         - containerPort: 27017 | ||||
|         volumeMounts: | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/db | ||||
|         - name: mongo-persistent-storage | ||||
|           mountPath: /data/configdb | ||||
|       volumes: | ||||
|       - name: mongo-persistent-storage | ||||
|         persistentVolumeClaim: | ||||
|           claimName: mongo-pvc | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: PersistentVolumeClaim | ||||
| metadata: | ||||
|   name: mongo-pvc | ||||
| spec: | ||||
|   accessModes: | ||||
|     - ReadWriteOnce | ||||
|   resources: | ||||
|     requests: | ||||
|       storage: 1Gi | ||||
| @@ -1,9 +0,0 @@ | ||||
| # mongo-secret.yml | ||||
| apiVersion: v1 | ||||
| kind: Secret | ||||
| metadata: | ||||
|   name: mongo-secret | ||||
| type: Opaque | ||||
| data: | ||||
|   username: dGVzdA==  # base64 encoding of 'test' | ||||
|   password: dGVzdA==  # base64 encoding of 'test' | ||||
| @@ -1,12 +0,0 @@ | ||||
| # mongo-service.yml | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: mongo | ||||
| spec: | ||||
|   selector: | ||||
|     app: mongo | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: 27017 | ||||
|       targetPort: 27017 | ||||
							
								
								
									
										3
									
								
								offline/latest.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								offline/latest.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| --- | ||||
|  | ||||
| version: 0.1.0 | ||||
							
								
								
									
										41
									
								
								offline/oc_1.0.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								offline/oc_1.0.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| --- | ||||
| # Définition d'une version | ||||
|  | ||||
| version: 1.0 | ||||
|  | ||||
| tools: | ||||
|   - name: kubectl | ||||
|     url: https://dl.k8s.io/release/%s/bin/linux/amd64/kubectl | ||||
|     version: v1.31.0 | ||||
|   - name: helm | ||||
|     url: https://get.helm.sh/helm-%s-linux-amd64.tar.gz | ||||
|     version: v3.16.0 | ||||
|  | ||||
| # helm install my-release <repo>/<chart> | ||||
| opencloud: | ||||
|   - repository: | ||||
|       name: bitnami | ||||
|       url: https://charts.bitnami.com/bitnami      # Repository des Charts | ||||
|     charts: | ||||
|       - name: wordpress | ||||
|         chart: bitnami/wordpress | ||||
|         version: 23.1.0 | ||||
|         values: {} | ||||
|         helm_opts: --wait-for-jobs | ||||
|         helm_filevalues: values-init.yml | ||||
|  | ||||
|       - name: phpmyadmin | ||||
|         chart: bitnami/phpmyadmin | ||||
|         version: 17.0.4 | ||||
|         values: {} | ||||
|  | ||||
|   - charts: | ||||
|      - name: mongo | ||||
|        chart:  ../oc-mongo/mongo | ||||
|   | ||||
|   - charts: | ||||
|       - name: myfirstrelease | ||||
|         chart: myfirstchart-0.1.0.tgz | ||||
|         url: https://zzzz/myfirstchart-0.1.0.tgz | ||||
|  | ||||
| # helm install myfirstrelease myfirstchart-0.1.0.tgz | ||||
							
								
								
									
										3
									
								
								publish/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								publish/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| go.sum | ||||
| *_ | ||||
| .coverage.* | ||||
							
								
								
									
										3
									
								
								publish/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								publish/go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| module oc-publish | ||||
|  | ||||
| go 1.22.2 | ||||
							
								
								
									
										83
									
								
								publish/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								publish/main.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     "os" | ||||
|     "io/ioutil" | ||||
|     "encoding/base64" | ||||
|     "oc-publish/releases" | ||||
|     "oc-publish/occonst" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
|  | ||||
|     version := os.Args[1] | ||||
|  | ||||
|     fmt.Printf(" >> oc-publish :\n") | ||||
|  | ||||
|     fmt.Printf(" <<   Url : %s/%s\n", occonst.PUBLISH_URL, occonst.PUBLISH_REPO) | ||||
|  | ||||
|     fmt.Printf(" <<   version : %s %s\n", version, occonst.PUBLISH_BRANCH) | ||||
|  | ||||
|     vversion := fmt.Sprintf("v%s", version) | ||||
|     existe, _ := releases.CheckRelease(vversion) | ||||
|  | ||||
|     if existe == false { | ||||
|         err := releases.CreateRelease(vversion, occonst.PUBLISH_BRANCH) | ||||
|         if err != nil { | ||||
|             fmt.Println(err) | ||||
|             os.Exit(1) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     idRelease, _ := releases.GetReleaseId(vversion) | ||||
|     if  existe == true { | ||||
|         fmt.Println(fmt.Sprintf(" <<   Release existante : %d ", idRelease)) | ||||
|     } else { | ||||
|         fmt.Println(fmt.Sprintf(" <<   Release crée : %d ", idRelease)) | ||||
|     } | ||||
|  | ||||
|     assetname := "oc-deploy.base64" | ||||
|     binary := fmt.Sprintf("../bin/oc-deploy") | ||||
|     binary64 := fmt.Sprintf("../%s", assetname) | ||||
|     err := createBinaryFile(binary, binary64) | ||||
|     if err != nil { | ||||
|         fmt.Println(err) | ||||
|         os.Exit(1) | ||||
|     } | ||||
|  | ||||
|     idAsset, _ := releases.GetAssetId(idRelease, assetname) | ||||
|     if idAsset == 0 { | ||||
|         fmt.Println(fmt.Sprintf(" <<   Ajout Asset : %s", assetname)) | ||||
|         err := releases.CreateAsset(idRelease, binary64, assetname) | ||||
|         if err != nil { | ||||
|             fmt.Println(err) | ||||
|             os.Exit(1) | ||||
|         }     | ||||
|     } else { | ||||
|         fmt.Println(fmt.Sprintf(" <<   Mise à jour : %s (idAsset=%d) ", assetname, idAsset)) | ||||
|         err := releases.UpdateAsset(idRelease, idAsset, binary64, assetname) | ||||
|         if err != nil { | ||||
|             fmt.Println(err) | ||||
|             os.Exit(1) | ||||
|         }     | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| func createBinaryFile(source string, dest string) error { | ||||
|     fout, _ := os.Create(dest) | ||||
|     defer fout.Close() | ||||
|  | ||||
|     byteValue, err := ioutil.ReadFile(source) | ||||
|     if err != nil { | ||||
|         fmt.Println("64e", err) | ||||
|  | ||||
|         return err | ||||
|     } | ||||
|  | ||||
|     data64 := base64.StdEncoding.EncodeToString(byteValue) | ||||
|     fout.Write([]byte(data64)) | ||||
|     return nil | ||||
| } | ||||
							
								
								
									
										18
									
								
								publish/occonst/variables.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								publish/occonst/variables.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| package occonst | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| var PUBLISH_URL = getenv("PUBLISH_URL", "https://cloud.o-forge.io") | ||||
| var PUBLISH_REPO = getenv("PUBLISH_REPO", "core/oc-deploy") | ||||
| var PUBLISH_TOKEN = getenv("PUBLISH_TOKEN", "") | ||||
| var PUBLISH_BRANCH = getenv("PUBLISH_BRANCH", "main") | ||||
|  | ||||
| func getenv(key string, defaut string) string { | ||||
| 	value := os.Getenv(key) | ||||
| 	if len(value) == 0 { | ||||
| 		return defaut | ||||
| 	} | ||||
| 	return value | ||||
| } | ||||
							
								
								
									
										6
									
								
								publish/release.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								publish/release.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| Version %s d'OpenCloud | ||||
|  | ||||
| ``` | ||||
| wget %s/%s/releases/download/%s/oc-deploy.base64 -O - | base64 -d > oc-deploy | ||||
| chmod u+x ./oc-deploy | ||||
| ``` | ||||
							
								
								
									
										145
									
								
								publish/releases/assets.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								publish/releases/assets.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| package releases | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     "os" | ||||
|     "path/filepath" | ||||
|     "mime/multipart" | ||||
|     "io" | ||||
|     "io/ioutil" | ||||
|     "encoding/json" | ||||
|     "net/http" | ||||
|     "bytes" | ||||
|  | ||||
|     "oc-publish/occonst" | ||||
| ) | ||||
|  | ||||
| type assetStruct struct { | ||||
|     Name string `json:"name"` | ||||
|     Id int `json:"id"` | ||||
| } | ||||
|  | ||||
| func GetAssetId(idRelease int, name string) (int, error) { | ||||
|     url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets", | ||||
|                         occonst.PUBLISH_URL, | ||||
|                         occonst.PUBLISH_REPO, | ||||
|                         idRelease) | ||||
|  | ||||
|     res, err := http.Get(url) | ||||
|     if err != nil { | ||||
|         return -1, err | ||||
|     } | ||||
|     body, err := io.ReadAll(res.Body) | ||||
|     if err != nil { | ||||
|         return -2, err | ||||
|     } | ||||
|  | ||||
|     var data []assetStruct | ||||
|  | ||||
|     err = json.Unmarshal(body, &data) | ||||
|     if err != nil { | ||||
|         return -3, err | ||||
|     } | ||||
|  | ||||
|     for _, ele := range data { | ||||
|         if ele.Name == name { | ||||
|             return ele.Id, nil | ||||
|         } | ||||
|     } | ||||
|     return 0, nil | ||||
| } | ||||
|  | ||||
| // curl -X 'POST' \ | ||||
| //   'https://cloud.o-forge.io/api/v1/repos/core/oc-deploy/releases/2/assets?name=zzzz' \ | ||||
| //   -H 'accept: application/json' \ | ||||
| //   -H 'Content-Type: multipart/form-data' \ | ||||
| //   -F 'attachment=oc-deploy' | ||||
| func CreateAsset(idRelease int, filename string, name string) (error) { | ||||
|     url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets?name=%s&token=%s", | ||||
|                         occonst.PUBLISH_URL, | ||||
|                         occonst.PUBLISH_REPO, | ||||
|                         idRelease, | ||||
|                         name, | ||||
|                         occonst.PUBLISH_TOKEN) | ||||
|  | ||||
|     err := uploadFile(url, "attachment", filename) | ||||
|  | ||||
|     return err  | ||||
| } | ||||
|  | ||||
| func UpdateAsset(idRelease int, idAsset int, filename string, name string) (error) { | ||||
|  | ||||
|   url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets/%d?token=%s", | ||||
|             occonst.PUBLISH_URL, | ||||
|             occonst.PUBLISH_REPO, | ||||
|             idRelease, | ||||
|             idAsset, | ||||
|             occonst.PUBLISH_TOKEN) | ||||
|  | ||||
|     // Create client | ||||
|     client := &http.Client{} | ||||
|  | ||||
|     // Create request | ||||
|     req, err := http.NewRequest("DELETE", url, nil) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|  | ||||
|     // Fetch Request | ||||
|     resp, err := client.Do(req) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|     defer resp.Body.Close() | ||||
|  | ||||
|     // Read Response Body | ||||
|     respBody, err := ioutil.ReadAll(resp.Body) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|     fmt.Println(string(respBody)) | ||||
|  | ||||
|   return CreateAsset(idRelease, filename, name) | ||||
| } | ||||
|  | ||||
| func uploadFile(url string, paramName string, filePath string) error { | ||||
|     file, err := os.Open(filePath) | ||||
|     if err != nil { | ||||
|       return err | ||||
|     } | ||||
|     defer file.Close() | ||||
|  | ||||
|     body := &bytes.Buffer{} | ||||
|     writer := multipart.NewWriter(body) | ||||
|     part, err := writer.CreateFormFile(paramName, filepath.Base(filePath)) | ||||
|     if err != nil { | ||||
|       return err | ||||
|     } | ||||
|     _, err = io.Copy(part, file) | ||||
|    | ||||
|     err = writer.Close() | ||||
|     if err != nil { | ||||
|       return err | ||||
|     } | ||||
|    | ||||
|     request, err := http.NewRequest("POST", url, body) | ||||
|     request.Header.Add("Content-Type", writer.FormDataContentType()) | ||||
|     request.Header.Add("accept", "application/json") | ||||
|     client := &http.Client{} | ||||
|     response, err := client.Do(request) | ||||
|  | ||||
|     if err != nil { | ||||
|       fmt.Println(109, err) | ||||
|       return err | ||||
|     } | ||||
|     defer response.Body.Close() | ||||
|    | ||||
|     if response.StatusCode > 400 { | ||||
|         return fmt.Errorf(response.Status) | ||||
|   } | ||||
|  | ||||
|     _, err1 := io.ReadAll(response.Body) | ||||
|  | ||||
|     // Handle the server response... | ||||
|     return err1 | ||||
|   } | ||||
							
								
								
									
										126
									
								
								publish/releases/release.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								publish/releases/release.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| package releases | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
|     "strings" | ||||
|     "encoding/json" | ||||
|     "net/http" | ||||
|  | ||||
| 	"oc-publish/occonst" | ||||
| ) | ||||
|  | ||||
| type checkStruct struct { | ||||
|     Name string `json:"name"` | ||||
|     Id int `json:"id"` | ||||
| } | ||||
|  | ||||
| func CheckRelease(version string) (bool, error) { | ||||
| 	url := fmt.Sprintf("%s/api/v1/repos/%s/releases", | ||||
| 						occonst.PUBLISH_URL, | ||||
| 						occonst.PUBLISH_REPO) | ||||
|  | ||||
|     res, err := http.Get(url) | ||||
|     if err != nil { | ||||
|         return false, err | ||||
|     } | ||||
|     body, err := io.ReadAll(res.Body) | ||||
|     if err != nil { | ||||
|         return false, err | ||||
|     } | ||||
|  | ||||
| 	var data []checkStruct | ||||
|     err = json.Unmarshal(body, &data) | ||||
|     if err != nil { | ||||
|         return false, err | ||||
|     } | ||||
|  | ||||
|     for _, ele := range data { | ||||
|         if ele.Name == version { | ||||
|             return true, nil | ||||
|         } | ||||
|     } | ||||
| 	// return data.Name != "", nil | ||||
|     return false, nil | ||||
| } | ||||
|  | ||||
| func GetReleaseId(version string) (int, error) { | ||||
| 	url := fmt.Sprintf("%s/api/v1/repos/%s/releases/tags/%s", | ||||
| 						occonst.PUBLISH_URL, | ||||
| 						occonst.PUBLISH_REPO, | ||||
| 						version) | ||||
|  | ||||
|     res, err := http.Get(url) | ||||
|     if err != nil { | ||||
|         return 0, err | ||||
|     } | ||||
|     body, err := io.ReadAll(res.Body) | ||||
|     if err != nil { | ||||
|         return 0, err | ||||
|     } | ||||
|  | ||||
| 	var data checkStruct | ||||
|     err = json.Unmarshal(body, &data) | ||||
|     if err != nil { | ||||
|         return 0, err | ||||
|     } | ||||
|  | ||||
| 	return data.Id, nil | ||||
| } | ||||
|  | ||||
| // curl -X 'POST' \ | ||||
| //   'https://cloud.o-forge.io/api/v1/repos/na/oc-version/releases?token=sss' \ | ||||
| //   -H 'accept: application/json' \ | ||||
| //   -H 'Content-Type: application/json' \ | ||||
| //   -d '{ | ||||
| //   "body": "string", | ||||
| //   "draft": true, | ||||
| //   "name": "string", | ||||
| //   "prerelease": true, | ||||
| //   "tag_name": "string", | ||||
| //   "target_commitish": "string" | ||||
| // }' | ||||
| func CreateRelease(version string, branch string) (error) { | ||||
| 	url := fmt.Sprintf("%s/api/v1/repos/%s/releases?token=%s", | ||||
| 						occonst.PUBLISH_URL, | ||||
| 						occonst.PUBLISH_REPO, | ||||
| 						occonst.PUBLISH_TOKEN) | ||||
|  | ||||
|     releasebytes, err := ioutil.ReadFile("release.txt") | ||||
|     releasetxt := string(releasebytes) | ||||
|     releasetxt = strings.Replace(releasetxt, "\n", "\\n", -1) | ||||
|     releasetxt = fmt.Sprintf(releasetxt, version, occonst.PUBLISH_URL, occonst.PUBLISH_REPO, version) | ||||
|  | ||||
|     body := fmt.Sprintf(`{ | ||||
|     "body": "%s", | ||||
|     "draft": false, | ||||
|     "name": "%s", | ||||
|     "prerelease": false, | ||||
|     "tag_name": "%s", | ||||
|     "target_commitish": "%s" | ||||
| }`, releasetxt, version, version, branch) | ||||
|  | ||||
|     request, err := http.NewRequest("POST", url, strings.NewReader(body)) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|     request.Header.Add("accept", "application/json") | ||||
|     request.Header.Add("Content-Type", "application/json") | ||||
|  | ||||
|     client := &http.Client{} | ||||
|     response, err := client.Do(request) | ||||
|     if err != nil { | ||||
|         return err | ||||
|     } | ||||
|     defer response.Body.Close() | ||||
|  | ||||
|     _, err1 := io.ReadAll(response.Body) | ||||
|     // cnt, err1 := io.ReadAll(response.Body) | ||||
|     // fmt.Println(string(cnt)) | ||||
|  | ||||
|     if err1 != nil { | ||||
|         return err1 | ||||
|     } | ||||
|     return nil | ||||
| } | ||||
							
								
								
									
										5
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| go.sum | ||||
| *_ | ||||
| .coverage.* | ||||
| .*.log | ||||
| workspace_* | ||||
							
								
								
									
										79
									
								
								src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
|  | ||||
| BIN_NAME := oc-deploy | ||||
|  | ||||
| BIN_OPTS :=  | ||||
|  | ||||
| ################## | ||||
|  | ||||
| SOURCES := $(wildcard *.go) $(wildcard */*.go) | ||||
| BIN_DIR = ../bin/ | ||||
|  | ||||
| PLUGINS := $(wildcard ../plugins/*/*.go) | ||||
| OBJS    := ${PLUGINS:.go=.so} | ||||
|  | ||||
| %.so: %.go | ||||
| 	go build -buildmode=plugin -o $@ $< | ||||
|  | ||||
| help: | ||||
| 		@echo | ||||
| 		@echo 'Usage:' | ||||
| 		@echo '    make build                Génère les exécutables.' | ||||
| 		@echo '    make get-deps             Dependency download' | ||||
|  | ||||
| 		@echo '    make run BIN_OPTS=...     Go run' | ||||
| 		@echo '    make run_install BIN_OPTS=...     Go run' | ||||
| 		@echo '    make run_uninstall BIN_OPTS=...     Go run' | ||||
| 		@echo '    make exec BIN_OPTS=...    exécutable' | ||||
| 		@echo '    make exec_install BIN_OPTS=...    exécutable' | ||||
| 		@echo '    make exec_uninstall BIN_OPTS=...    exécutable' | ||||
| 		@echo '    make test                 Test.' | ||||
| 		 | ||||
| 		@echo '    make test                 Test' | ||||
| 		@echo '    make clean                Clean the directory tree.' | ||||
| 		@echo | ||||
|  | ||||
| ${BIN_DIR}/${BIN_NAME}: ${SOURCES} $(OBJS) | ||||
| 	go build -o ${BIN_DIR}/${BIN_NAME} | ||||
|  | ||||
| get-deps: | ||||
| 	@go mod tidy | ||||
|  | ||||
| build: ${BIN_DIR}/${BIN_NAME} | ||||
|  | ||||
| run: $(OBJS) | ||||
| 	@go run main.go ${BIN_OPTS} | ||||
|  | ||||
| run_generate: $(OBJS) | ||||
| 	@go run main.go generate ${BIN_OPTS} | ||||
|  | ||||
| run_install: $(OBJS) | ||||
| 	@go run main.go install ${BIN_OPTS} | ||||
|  | ||||
| run_uninstall: $(OBJS) | ||||
| 	@go run main.go uninstall ${BIN_OPTS} | ||||
|  | ||||
| exec: ${BIN_DIR}/${BIN_NAME} $(OBJS) | ||||
| 	@${BIN_DIR}/${BIN_NAME} ${BIN_OPTS} | ||||
|  | ||||
| exec_install: ${BIN_DIR}/${BIN_NAME} $(OBJS) | ||||
| 	@${BIN_DIR}/${BIN_NAME} install ${BIN_OPTS} | ||||
|  | ||||
| exec_uninstall: ${BIN_DIR}/${BIN_NAME} $(OBJS) | ||||
| 	@${BIN_DIR}/${BIN_NAME} uninstall ${BIN_OPTS} | ||||
|  | ||||
| clean: | ||||
| 	@test ! -e ${BIN_DIR}/${BIN_NAME} || rm ${BIN_DIR}/${BIN_NAME} | ||||
| 	@test ! -e .coverage.out || rm .coverage.out | ||||
| 	@test ! -e .coverage.html || rm .coverage.html | ||||
| 	@test ! -e go.sum || rm go.sum | ||||
| 	@test ! -e .oc-deploy.log || rm .oc-deploy.log | ||||
| 	@rm -rf workspace_* | ||||
|  | ||||
| .PHONY: test | ||||
| test_%: | ||||
| 	go test oc-deploy/$(subst test_,,$@) -coverprofile=.coverage.out -v | ||||
| 	@go tool cover -html=.coverage.out -o .coverage.html | ||||
|  | ||||
| test: | ||||
| 	@go test ./... -coverprofile=.coverage.out -v | ||||
| 	go tool cover -html=.coverage.out -o .coverage.html | ||||
							
								
								
									
										58
									
								
								src/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| # Purpose | ||||
|  | ||||
| **oc-deploy** is a tool to deploy (with **helm**) all component of **OpenCloud**. | ||||
|  | ||||
| # Development | ||||
|  | ||||
| To init:  | ||||
|  | ||||
| ``` | ||||
|   make get-deps | ||||
| ``` | ||||
|  | ||||
| ## To build | ||||
|  | ||||
| ``` | ||||
|   make build | ||||
| ``` | ||||
|  | ||||
| ## To run | ||||
|  | ||||
| ``` | ||||
|   make run_install [BIN_OPTS="<args>"] | ||||
|   make run_uninstall [BIN_OPTS="<args>"] | ||||
|   make run_generate [BIN_OPTS="<args>"] | ||||
| ``` | ||||
|  | ||||
| or | ||||
|  | ||||
| ``` | ||||
|   make exec_install [BIN_OPTS="<args>"] | ||||
|   make exec_uninstall [BIN_OPTS="<args>"] | ||||
|   make exec_generate [BIN_OPTS="<args>"] | ||||
| ``` | ||||
|  | ||||
| # To Test | ||||
|  | ||||
| All packages: | ||||
|  | ||||
| ``` | ||||
|   make test | ||||
| ``` | ||||
|  | ||||
| or to test an specific package: | ||||
|  | ||||
| ``` | ||||
|   make test_<package> | ||||
| ``` | ||||
|  | ||||
| Test generate _.coverage.html_ file to view the coverage of test. | ||||
|  | ||||
| ## To Publish | ||||
|  | ||||
| Cf : ../publish | ||||
|  | ||||
| ## Divers | ||||
|  | ||||
| * Latest version for _kubectl_: https://dl.k8s.io/release/stable.txt | ||||
| * Release for _helm_: https://github.com/helm/helm/releases | ||||
							
								
								
									
										46
									
								
								src/chart/conf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/chart/conf.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| package chart | ||||
|  | ||||
| import ( | ||||
|     "os" | ||||
|     "gopkg.in/yaml.v2" | ||||
| ) | ||||
|  | ||||
| type ChartData struct { | ||||
|     Name string `yaml:"name"` | ||||
|     Chart string `yaml:"chart"` | ||||
|     Url string `yaml:"url"` | ||||
|     Version string `yaml:"version"` | ||||
|  | ||||
|     Opts string `yaml:"helm_opts"` | ||||
|     Values map[string]string `yaml:"helm_values"` | ||||
|     FileValues []string `yaml:"helm_filevalues"` | ||||
|  | ||||
|     Overwrite string `yaml:"helm_overwrite"` | ||||
| } | ||||
|  | ||||
| type repoData struct { | ||||
|     Name string `yaml:"name"` | ||||
|     Url string `yaml:"url"` | ||||
|     ForceUpdate bool `yaml:"forceupdate"` | ||||
|     Opts string `yaml:"opts"` | ||||
| } | ||||
|  | ||||
| type ChartRepoData struct { | ||||
|     Repository repoData `yaml:"repository"` | ||||
|     Charts []ChartData `yaml:"charts"` | ||||
| } | ||||
|  | ||||
| type chartsRepoParse struct { | ||||
|     Charts []ChartRepoData `yaml:"opencloud"` | ||||
| } | ||||
|  | ||||
| func FromConfigFile(filename string) ([]ChartRepoData, error) { | ||||
|     yamlFile, _ := os.ReadFile(filename) | ||||
|  | ||||
|     var data chartsRepoParse | ||||
|     err := yaml.Unmarshal(yamlFile, &data) | ||||
|     if err != nil { | ||||
|         return data.Charts, err | ||||
|     } | ||||
|     return data.Charts, nil | ||||
| } | ||||
							
								
								
									
										50
									
								
								src/chart/conf_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/chart/conf_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| package chart | ||||
|  | ||||
| import ( | ||||
|     "testing" | ||||
|     "path/filepath" | ||||
|     "github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
|  | ||||
| func _TestReadConfChart(t *testing.T) { | ||||
|     src := filepath.Join(TEST_SRC_DIR, "oc.yml") | ||||
|  | ||||
|     assert.FileExists(t, src, "FromConfigFile error") | ||||
|  | ||||
|     data, _ := FromConfigFile(src) | ||||
|     assert.Equal(t, "bitnami", data[0].Repository.Name, "FromConfigFile error") | ||||
|     assert.Equal(t, "https://charts.bitnami.com/bitnami", data[0].Repository.Url, "FromConfigFile error") | ||||
|  | ||||
|     wordpress := data[0].Charts[0] | ||||
|     assert.Equal(t, "wordpress", wordpress.Name, "FromConfigFile error") | ||||
|     assert.Equal(t, "bitnami/wordpress", wordpress.Chart, "FromConfigFile error") | ||||
|     assert.Equal(t, "23.1.0", wordpress.Version, "FromConfigFile error") | ||||
|     assert.Equal(t, 0, len(wordpress.FileValues), "FromConfigFile error") | ||||
|     assert.Equal(t, 0, len(wordpress.Values), "FromConfigFile error") | ||||
|  | ||||
|     phpmyadmin := data[0].Charts[1] | ||||
|     assert.Equal(t, "phpmyadmin", phpmyadmin.Name, "FromConfigFile error") | ||||
|     assert.Equal(t, "bitnami/phpmyadmin", phpmyadmin.Chart,"FromConfigFile error") | ||||
|     assert.Equal(t, "17.0.4", phpmyadmin.Version, "FromConfigFile error") | ||||
|     assert.Equal(t, 2, len(phpmyadmin.FileValues), "FromConfigFile error") | ||||
|     assert.Equal(t, 1, len(phpmyadmin.Values), "FromConfigFile error") | ||||
|  | ||||
|     data1 := data[1] | ||||
|     assert.Equal(t, "", data1.Repository.Name, "FromConfigFile error") | ||||
|     assert.Equal(t, "", data1.Repository.Url, "FromConfigFile error") | ||||
|  | ||||
|     myfirstrelease := data1.Charts[0] | ||||
|     assert.Equal(t, "myfirstrelease", myfirstrelease.Name, "FromConfigFile error") | ||||
|     assert.Equal(t, "https://zzzz/myfirstchart-0.1.0.tgz", myfirstrelease.Url, "FromConfigFile error") | ||||
| } | ||||
|  | ||||
| func TestReadConfChartOverwrite(t *testing.T){ | ||||
|     src := filepath.Join(TEST_SRC_DIR, "oc_overwrite.yml") | ||||
|  | ||||
|     assert.FileExists(t, src, "FromConfigFile error") | ||||
|  | ||||
|     data, _ := FromConfigFile(src) | ||||
|     // Nombre de lettres | ||||
|     assert.Equal(t, 70, len(data[0].Charts[0].Overwrite), "TestReadConfChartOverwrite error") | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/chart/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/chart/main_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package chart | ||||
|  | ||||
| import ( | ||||
|     "os" | ||||
|     "testing" | ||||
|     "path/filepath" | ||||
| ) | ||||
|  | ||||
| var TEST_DEST_DIR = "../wrk_chart" | ||||
| var TEST_SRC_DIR = filepath.Join("../../test", "chart") | ||||
|  | ||||
| func TestMain(m *testing.M) { | ||||
|     folderPath := TEST_DEST_DIR | ||||
|  | ||||
|     os.RemoveAll(folderPath) | ||||
|     os.MkdirAll(folderPath, os.ModePerm) | ||||
|  | ||||
|     // call flag.Parse() here if TestMain uses flags | ||||
|     exitCode := m.Run() | ||||
|  | ||||
|     os.RemoveAll(folderPath) | ||||
|     os.Exit(exitCode) | ||||
| } | ||||
							
								
								
									
										85
									
								
								src/cmd/args.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/cmd/args.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| // Package cmd : Parse les arguments | ||||
|  | ||||
| // Arguments : version ==> version d'OpenCloud | ||||
| // Argument : projet ==> nom du projet | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "github.com/spf13/cobra" | ||||
|  | ||||
|     log "oc-deploy/log_wrapper" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
|     context string | ||||
|     version string | ||||
|     modules []string | ||||
| ) | ||||
|  | ||||
|  | ||||
| func cobraInstallCmd() *cobra.Command { | ||||
|   return &cobra.Command{ | ||||
|     Use:   "install", | ||||
|     Short: "install", | ||||
|     Long: `deploy Charts`, | ||||
|     Args: cobra.MaximumNArgs(0), | ||||
|     RunE: func(cmd *cobra.Command, args []string) error { | ||||
|       return InstallCmd(context, version, modules) | ||||
|     }, | ||||
|     Example: "oc-deploy install --version 0.1.0 --context ex1", | ||||
|   } | ||||
| } | ||||
|  | ||||
| func cobraUninstallCmd() *cobra.Command{ | ||||
|   return &cobra.Command{ | ||||
|     Use:   "uninstall", | ||||
|     Short: "undeploy", | ||||
|     Long: `Undeploy`, | ||||
|     Args: cobra.MaximumNArgs(0), | ||||
|     RunE: func(cmd *cobra.Command, args []string) error { | ||||
|       return UninstallCmd(context) | ||||
|     }, | ||||
|     Example: "oc-deploy uninstall --context ex1", | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| func cobraGenerateCmd() *cobra.Command{ | ||||
|   return &cobra.Command{ | ||||
|     Use:   "generate", | ||||
|     Short: "generate", | ||||
|     Long: "Value", | ||||
|     Args: cobra.MaximumNArgs(0), | ||||
|     RunE: func(cmd *cobra.Command, args []string) error { | ||||
|         return GenerateCmd(context, version) | ||||
|     }, | ||||
|     Example: "oc-deploy generate --version 0.1.0 --context ex1", | ||||
|   } | ||||
| } | ||||
|  | ||||
| func Execute() { | ||||
|  | ||||
|     log.Log().Debug().Msg("Execute") | ||||
|  | ||||
|     var rootCmd = &cobra.Command{Use: "oc-deploy"} | ||||
|  | ||||
|     var cmdInstall = cobraInstallCmd() | ||||
|     var cmdUninstall = cobraUninstallCmd() | ||||
|     var cmdGenerate = cobraGenerateCmd() | ||||
|  | ||||
|     cmdInstall.Flags().StringVarP(&context, "context", "c", "opencloud", "Nom du context") | ||||
|     cmdInstall.Flags().StringVarP(&version, "version", "v", "latest", "Version") | ||||
|     cmdInstall.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules, ...") | ||||
|  | ||||
|     cmdUninstall.Flags().StringVarP(&context, "context", "c", "opencloud", "Nom du context") | ||||
|  | ||||
|     cmdGenerate.Flags().StringVarP(&context, "context", "c", "opencloud", "Nom du context") | ||||
|     cmdGenerate.Flags().StringVarP(&version, "version", "v", "latest", "Version") | ||||
|  | ||||
|     rootCmd.AddCommand(cmdInstall) | ||||
|     rootCmd.AddCommand(cmdUninstall) | ||||
|     rootCmd.AddCommand(cmdGenerate) | ||||
|  | ||||
|     cobra.CheckErr(rootCmd.Execute()) | ||||
|  | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/cmd/args_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/cmd/args_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "testing" | ||||
| ) | ||||
|  | ||||
| func TestExecute(t *testing.T) { | ||||
|     Execute() | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/cmd/generateCmd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/cmd/generateCmd.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     log "oc-deploy/log_wrapper" | ||||
|  | ||||
|     // "oc-deploy/versionOc" | ||||
|     "oc-deploy/install" | ||||
| ) | ||||
|  | ||||
| func GenerateCmd(prcontextoject string, version string) error { | ||||
|     log.Log().Info().Msg("Generate >> ") | ||||
|  | ||||
|     workspace := fmt.Sprintf("workspace_%s", context) | ||||
|  | ||||
|     obj := install.InstallClass{Workspace: workspace, Version: version} | ||||
|     _, err := obj.NewGenerate() | ||||
|     if err != nil { | ||||
|       log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     return err | ||||
| } | ||||
							
								
								
									
										51
									
								
								src/cmd/installCmd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/cmd/installCmd.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     log "oc-deploy/log_wrapper" | ||||
|  | ||||
|     "oc-deploy/install" | ||||
| ) | ||||
|  | ||||
| func InstallCmd(context string, version string, modules []string) error { | ||||
|     log.Log().Info().Msg("Install >> ") | ||||
|  | ||||
|     log.Log().Info().Msg("  << Contexte  : " + context) | ||||
|     if len(modules) > 0 { | ||||
|         log.Log().Info().Msg(fmt.Sprintf("  << Modules   : %s", modules)) | ||||
|     } | ||||
|  | ||||
|     workspace := fmt.Sprintf("workspace_%s", context) | ||||
|     obj := install.InstallClass{Workspace: workspace, Version: version} | ||||
|  | ||||
|     file, err := obj.NewInstall() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|     log.Log().Info().Msg(fmt.Sprintf("  << Version   : %s", obj.Version)) | ||||
|     log.Log().Info().Msg(fmt.Sprintf("  >> Config    : %s", file)) | ||||
|  | ||||
|     err = obj.Tools() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     obj.SetCommands() | ||||
|  | ||||
|     err = obj.ChartRepo() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     err = obj.K8s(context) | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     err = obj.InstallCharts(modules) | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     return err | ||||
| } | ||||
							
								
								
									
										41
									
								
								src/cmd/installCmd_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/cmd/installCmd_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "bytes" | ||||
|     "github.com/spf13/cobra" | ||||
|  | ||||
|     "testing" | ||||
|  | ||||
|     "github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestInstallCommand(t *testing.T) { | ||||
|     cmd := cobraInstallCmd() | ||||
|  | ||||
|     inMock := false | ||||
|     cmd.RunE = func(cmd *cobra.Command, args []string) error { | ||||
|         inMock = true | ||||
|         return nil | ||||
|     } | ||||
|  | ||||
|     cmd.Execute() | ||||
|     assert.Truef(t, inMock, "TestInstallCommand") | ||||
| } | ||||
|  | ||||
| func TestInstallCommandErr(t *testing.T) { | ||||
|     cmd := cobraUninstallCmd() | ||||
|  | ||||
|     inMock := false | ||||
|     cmd.RunE = func(cmd *cobra.Command, args []string) error { | ||||
|         inMock = true | ||||
|         return nil | ||||
|     } | ||||
|  | ||||
|     cmd.SetArgs([]string{"bad"}) | ||||
|     b := bytes.NewBufferString("") | ||||
|     cmd.SetOut(b) | ||||
|  | ||||
|     err := cmd.Execute() | ||||
|     assert.Falsef(t, inMock, "TestInstallCommand args") | ||||
|     assert.NotNilf(t, err, "TestInstallCommand args") | ||||
| } | ||||
							
								
								
									
										45
									
								
								src/cmd/uninstallCmd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/cmd/uninstallCmd.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     // "strings" | ||||
|     // "github.com/spf13/cobra" | ||||
|  | ||||
|     log "oc-deploy/log_wrapper" | ||||
|  | ||||
|     // "oc-deploy/versionOc" | ||||
|     "oc-deploy/install" | ||||
| ) | ||||
|  | ||||
| func UninstallCmd(context string) error { | ||||
|     log.Log().Info().Msg("Uninstall >> ") | ||||
|  | ||||
|     log.Log().Info().Msg("  << Contexte  : " + context) | ||||
|  | ||||
|     workspace := fmt.Sprintf("workspace_%s", context) | ||||
|     obj := install.InstallClass{Workspace: workspace} | ||||
|  | ||||
|     file, err := obj.NewUninstall() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|     log.Log().Info().Msg(fmt.Sprintf("  << Version   : %s", obj.Version)) | ||||
|     log.Log().Info().Msg(fmt.Sprintf("  >> Config    : %s", file)) | ||||
|  | ||||
|     err = obj.Tools() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     err = obj.K8s(context) | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     err = obj.UninstallCharts() | ||||
|     if err != nil { | ||||
|         log.Log().Fatal().Msg("  >> " + err.Error()) | ||||
|     } | ||||
|  | ||||
|     return err | ||||
| } | ||||
							
								
								
									
										41
									
								
								src/cmd/uninstallCmd_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/cmd/uninstallCmd_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
|     "bytes" | ||||
|     "github.com/spf13/cobra" | ||||
|  | ||||
|     "testing" | ||||
|  | ||||
|     "github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestUninstallCommand(t *testing.T) { | ||||
|     cmd := cobraUninstallCmd() | ||||
|  | ||||
|     inMock := false | ||||
|     cmd.RunE = func(cmd *cobra.Command, args []string) error { | ||||
|         inMock = true | ||||
|         return nil | ||||
|     } | ||||
|  | ||||
|     cmd.Execute() | ||||
|     assert.Truef(t, inMock, "TestUninstallCommand") | ||||
| } | ||||
|  | ||||
| func TestUninstallCommandErr(t *testing.T) { | ||||
|     cmd := cobraUninstallCmd() | ||||
|  | ||||
|     inMock := false | ||||
|     cmd.RunE = func(cmd *cobra.Command, args []string) error { | ||||
|         inMock = true | ||||
|         return nil | ||||
|     } | ||||
|  | ||||
|     cmd.SetArgs([]string{"bad"}) | ||||
|     b := bytes.NewBufferString("") | ||||
|     cmd.SetOut(b) | ||||
|  | ||||
|     err := cmd.Execute() | ||||
|     assert.Falsef(t, inMock, "TestUninstallCommand args") | ||||
|     assert.NotNilf(t, err, "TestUninstallCommand args") | ||||
| } | ||||
							
								
								
									
										25
									
								
								src/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| module oc-deploy | ||||
|  | ||||
| go 1.22.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/jarcoal/httpmock v1.3.1 | ||||
| 	github.com/rs/zerolog v1.33.0 | ||||
| 	github.com/spf13/cobra v1.8.1 | ||||
| 	github.com/stretchr/testify v1.9.0 | ||||
| 	gopkg.in/yaml.v2 v2.4.0 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/inconshreveable/mousetrap v1.1.0 // indirect | ||||
| 	github.com/kr/pretty v0.3.1 // indirect | ||||
| 	github.com/mattn/go-colorable v0.1.13 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/rogpeppe/go-internal v1.11.0 // indirect | ||||
| 	github.com/spf13/pflag v1.0.5 // indirect | ||||
| 	golang.org/x/sys v0.22.0 // indirect | ||||
| 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
							
								
								
									
										173
									
								
								src/helm/chart.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								src/helm/chart.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| package helm | ||||
|  | ||||
| import ( | ||||
|     "fmt" | ||||
|     "strconv" | ||||
|     "os" | ||||
|     "strings" | ||||
|     "errors" | ||||
|     "path/filepath" | ||||
|     "encoding/json" | ||||
|     log "oc-deploy/log_wrapper" | ||||
| ) | ||||
|  | ||||
| type HelmChart struct { | ||||
|     Bin string | ||||
|     Name string | ||||
|     Chart string | ||||
|     Version string | ||||
|     Url string | ||||
|  | ||||
|     Workspace string | ||||
|     Opts string | ||||
|     Values map[string]string | ||||
|     FileValues []string | ||||
| } | ||||
|  | ||||
| type installInfoOutput struct { | ||||
|     Description string  `json:"description"` | ||||
|     Notes string  `json:"notes"` | ||||
|     Status string  `json:"status"` | ||||
| } | ||||
|  | ||||
| type installOutput struct { | ||||
|     Info installInfoOutput  `json:"info"` | ||||
| } | ||||
|  | ||||
| func (this HelmCommand) ChartInstall(data HelmChart) (string, error) { | ||||
|     bin := this.Bin | ||||
|  | ||||
|     existe, err := this.chartExists(data) | ||||
|     if err != nil { | ||||
|         return "", err | ||||
|     } | ||||
|      | ||||
|     if existe { | ||||
|         return "Existe déjà", nil | ||||
|     } | ||||
|  | ||||
|     ficChart := data.Chart | ||||
|     // Recherche locale | ||||
|     if _, err := os.Stat(ficChart); err != nil { | ||||
|     } else { | ||||
|         // Recherche voa le Workspace | ||||
|         ficChart := filepath.Join(data.Workspace, data.Chart) | ||||
|         if _, err := os.Stat(ficChart); err == nil { | ||||
|         } else { | ||||
|             if data.Url != "" { | ||||
|                 fmt.Println("============ 52 Télechargement", data.Url) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     msg := fmt.Sprintf("%s install %s %s %s --output json", bin, data.Name, ficChart, data.Opts) | ||||
|  | ||||
|     if data.Version != "" { | ||||
|         msg = fmt.Sprintf("%s --version %s", msg, data.Version) | ||||
|     } | ||||
|  | ||||
|     for key, value := range data.Values { | ||||
|         msg = fmt.Sprintf("%s --set %s=%s", msg, key, value) | ||||
|     } | ||||
|  | ||||
|     ficoverwrite := filepath.Join(data.Workspace, fmt.Sprintf("value-%s.yml", data.Name)) | ||||
|     if _, err := os.Stat(ficoverwrite); err != nil { | ||||
|         log.Log().Warn().Msg(ficoverwrite) | ||||
|     } else { | ||||
|         msg = fmt.Sprintf("%s --values %s", msg, ficoverwrite) | ||||
|     } | ||||
|  | ||||
|     for _, valuefilename := range data.FileValues { | ||||
|         fic := filepath.Join(data.Workspace, valuefilename) | ||||
|         if _, err := os.Stat(fic); err != nil { | ||||
|             log.Log().Warn().Msg(fic) | ||||
|         } else { | ||||
|             msg = fmt.Sprintf("%s --values %s", msg, fic) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     msg = strings.Replace(msg, "  ", " ", -1) | ||||
|  | ||||
|     log.Log().Debug().Msg(msg) | ||||
|  | ||||
|     cmd_args := strings.Split(msg, " ") | ||||
| 	cmd := this.Exec(cmd_args[0], cmd_args[1:]...) | ||||
|     stdout, err := cmd.CombinedOutput() | ||||
|  | ||||
|     if err != nil { | ||||
|         res := string(stdout) | ||||
|         res = strings.TrimSuffix(res, "\n") | ||||
|         return "", errors.New(res) | ||||
|     } | ||||
|  | ||||
|     var objmap installOutput | ||||
|  | ||||
|     err = json.Unmarshal(stdout, &objmap) | ||||
|     if err != nil { | ||||
|         return "", err | ||||
|     } | ||||
|  | ||||
|     res := objmap.Info.Status | ||||
|  | ||||
|     return res, nil | ||||
| } | ||||
|  | ||||
| func (this HelmCommand) ChartUninstall(data HelmChart) (string, error) { | ||||
|     bin := this.Bin | ||||
|  | ||||
|     log.Log().Info().Msg("  >> Chart : " + data.Name) | ||||
|  | ||||
|     existe, err := this.chartExists(data) | ||||
|     if err != nil { | ||||
|         return "", err | ||||
|     } | ||||
|     if ! existe { | ||||
|         return "Non présent", nil | ||||
|     } | ||||
|  | ||||
|     msg := fmt.Sprintf("%s uninstall %s", bin, data.Name) | ||||
|     log.Log().Debug().Msg(msg) | ||||
|  | ||||
|     cmd_args := strings.Split(msg, " ") | ||||
| 	cmd := this.Exec(cmd_args[0], cmd_args[1:]...) | ||||
|     stdout, err := cmd.CombinedOutput() | ||||
|  | ||||
|     res := string(stdout) | ||||
|     res = strings.TrimSuffix(res, "\n") | ||||
|  | ||||
|     log.Log().Debug().Msg(res) | ||||
|  | ||||
|     return res, err | ||||
| } | ||||
|  | ||||
| // ../bin/helm list --filter phpmyadminm --short | ||||
| func (this HelmCommand) chartExists(data HelmChart) (bool, error) { | ||||
|     bin := this.Bin | ||||
|  | ||||
|     msg := fmt.Sprintf("%s list --filter %s --no-headers", bin, data.Name) | ||||
|     log.Log().Debug().Msg(msg) | ||||
|  | ||||
|     cmd_args := strings.Split(msg, " ") | ||||
| 	cmd := this.Exec(cmd_args[0], cmd_args[1:]...) | ||||
|     stdout, err := cmd.CombinedOutput() | ||||
|     if err != nil { | ||||
|         log.Log().Debug().Msg(string(stdout)) | ||||
|         return false, errors.New(string(stdout)) | ||||
|     } | ||||
|  | ||||
|     res := string(stdout) | ||||
|     res = strings.TrimSuffix(res, "\n") | ||||
|  | ||||
|     log.Log().Debug().Msg(string(stdout)) | ||||
|     log.Log().Debug().Msg(strconv.FormatBool(res != "")) | ||||
|  | ||||
|     return res != "", nil | ||||
| } | ||||
|  | ||||
| // func (this HelmChart) GetRessources() (map[string]string, error) { | ||||
| //     hs := HelmStatus{Name: this.Name} | ||||
| //     hs.New(this.Bin) | ||||
| //     data, _ := hs.getRessources() | ||||
|  | ||||
| //     return data, nil | ||||
| // } | ||||
							
								
								
									
										30
									
								
								src/helm/chart_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/helm/chart_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| package helm | ||||
|  | ||||
| import ( | ||||
|     "testing" | ||||
|  | ||||
|     "github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestHelmChartExists(t *testing.T){ | ||||
|      | ||||
| 	cmd := getCmdHelm(true, `oc-catalog      default 1       2024-09-06 16:01:49.17368605 +0200 CEST deployed        oc-catalog-0.1.0        1.0`) | ||||
|  | ||||
| 	data := HelmChart{Name: "oc-catalog"} | ||||
|     res, err := cmd.chartExists(data) | ||||
|  | ||||
|     assert.Nilf(t, err, "error message %s", err) | ||||
|     assert.Truef(t, res, "TestHelmVersion error") | ||||
| } | ||||
|  | ||||
|  | ||||
| func TestHelmChartNotExists(t *testing.T){ | ||||
|      | ||||
| 	cmd := getCmdHelm(true, "\n") | ||||
|  | ||||
| 	data := HelmChart{Name: "phpmyadmin"} | ||||
|     res, err := cmd.chartExists(data) | ||||
|  | ||||
|     assert.Nilf(t, err, "error message %s", err) | ||||
|     assert.Falsef(t, res, "TestHelmVersion error") | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user