Last active
July 19, 2019 15:06
-
-
Save aslakknutsen/290e07efeff743600a1bcf558023f779 to your computer and use it in GitHub Desktop.
Template based json patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func TestX(t *testing.T) { | |
patchs := []Patch{ | |
Patch{ | |
Name: "telepresence", | |
Template: []byte(`[ | |
{{ if .Data.Has "/spec/template/metadata/labels/version" }} | |
{"op": "copy", "from": "/spec/template/metadata/labels/version", "path": "/spec/template/metadata/labels/version-source"}, | |
{{ end }} | |
{"op": "replace", "path": "/metadata/name", "value": "{{.Data.Value "/metadata/name"}}-{{.NewVersion}}"}, | |
{"op": "replace", "path": "/spec/template/spec/replicas", "value": "1"}, | |
{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "datawire/telepresence-k8s:{{.Vars.TelepresenceVersion}}"}, | |
{"op": "replace", "path": "/spec/template/metadata/labels/version", "value": "{{.NewVersion}}"}, | |
{"op": "replace", "path": "/spec/selector/matchLabels/version", "value": "{{.NewVersion}}"}, | |
{"op": "replace", "path": "/metadata/labels/version", "value": "{{.NewVersion}}"}, | |
{"op": "add", "path": "/spec/template/metadata/labels/telepresence", "value": "test"}, | |
{"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": { | |
"name": "TELEPRESENCE_CONTAINER_NAMESPACE", | |
"valueFrom": { | |
"fieldRef": { | |
"apiVersion": "v1", | |
"fieldPath": "metadata.namespace" | |
} | |
} | |
} | |
}, | |
{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}, | |
{"op": "remove", "path": "/spec/template/spec/containers/0/readinessProbe"}, | |
{{ template "basic-remove" }} | |
]`), | |
Variables: map[string]string{ | |
"TelepresenceVersion": "y", | |
}, | |
}, | |
Patch{ | |
Name: "basic-remove", | |
Template: []byte(` | |
{"op": "remove", "path": "/metadata/resourceVersion"}, | |
{"op": "remove", "path": "/metadata/uid"}, | |
{"op": "remove", "path": "/metadata/generation"}, | |
{"op": "remove", "path": "/metadata/creationTimestamp"} | |
`), | |
}, | |
} | |
e := NewEngine(patchs) | |
modified, err := e.Run("telepresence", []byte(org), map[string]string{ | |
"TelepresenceVersion": "x", | |
}) | |
if err != nil { | |
fmt.Println(err) | |
} | |
fmt.Printf("Modified document: %s\n", modified) | |
} | |
var org = ` | |
{ | |
"apiVersion": "extensions/v1beta1", | |
"kind": "Deployment", | |
"metadata": { | |
"annotations": { | |
"deployment.kubernetes.io/revision": "1", | |
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"extensions/v1beta1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"name\":\"productpage-v1\",\"namespace\":\"bookinfo\"},\"spec\":{\"replicas\":1,\"selector\":null,\"strategy\":{},\"template\":{\"metadata\":{\"annotations\":{\"kiali.io/runtimes\":\"go\",\"prometheus.io/path\":\"/metrics\",\"prometheus.io/port\":\"9080\",\"prometheus.io/scheme\":\"http\",\"prometheus.io/scrape\":\"true\",\"sidecar.istio.io/inject\":\"true\"},\"creationTimestamp\":null,\"labels\":{\"app\":\"productpage\",\"version\":\"v1\"}},\"spec\":{\"containers\":[{\"env\":[{\"name\":\"SERVICE_NAME\",\"value\":\"productpage-v1\"},{\"name\":\"HTTP_ADDR\",\"value\":\":9080\"},{\"name\":\"SERVICE_CALL\",\"value\":\"http://reviews:9080/\"}],\"image\":\"docker.io/aslakknutsen/istio-workspace-test:latest\",\"imagePullPolicy\":\"Always\",\"livenessProbe\":{\"httpGet\":{\"path\":\"/healthz\",\"port\":9080},\"initialDelaySeconds\":1,\"periodSeconds\":3},\"name\":\"productpage\",\"ports\":[{\"containerPort\":9080}],\"readinessProbe\":{\"httpGet\":{\"path\":\"/healthz\",\"port\":9080},\"initialDelaySeconds\":1,\"periodSeconds\":3},\"resources\":{}}]}}},\"status\":{}}\n" | |
}, | |
"creationTimestamp": "2019-07-13T08:46:46Z", | |
"generation": 1, | |
"labels": { | |
"app": "productpage", | |
"version": "v1" | |
}, | |
"name": "productpage-v1", | |
"namespace": "bookinfo", | |
"resourceVersion": "638482", | |
"selfLink": "/apis/extensions/v1beta1/namespaces/bookinfo/deployments/productpage-v1", | |
"uid": "bf2a3655-a54a-11e9-b309-482ae3045b54" | |
}, | |
"spec": { | |
"progressDeadlineSeconds": 600, | |
"replicas": 1, | |
"revisionHistoryLimit": 10, | |
"selector": { | |
"matchLabels": { | |
"app": "productpage", | |
"version": "v1" | |
} | |
}, | |
"strategy": { | |
"rollingUpdate": { | |
"maxSurge": 1, | |
"maxUnavailable": 1 | |
}, | |
"type": "RollingUpdate" | |
}, | |
"template": { | |
"metadata": { | |
"annotations": { | |
"kiali.io/runtimes": "go", | |
"prometheus.io/path": "/metrics", | |
"prometheus.io/port": "9080", | |
"prometheus.io/scheme": "http", | |
"prometheus.io/scrape": "true", | |
"sidecar.istio.io/inject": "true" | |
}, | |
"creationTimestamp": null, | |
"labels": { | |
"app": "productpage", | |
"version": "v1" | |
} | |
}, | |
"spec": { | |
"containers": [ | |
{ | |
"env": [ | |
{ | |
"name": "SERVICE_NAME", | |
"value": "productpage-v1" | |
}, | |
{ | |
"name": "HTTP_ADDR", | |
"value": ":9080" | |
}, | |
{ | |
"name": "SERVICE_CALL", | |
"value": "http://reviews:9080/" | |
} | |
], | |
"image": "docker.io/aslakknutsen/istio-workspace-test:latest", | |
"imagePullPolicy": "Always", | |
"livenessProbe": { | |
"failureThreshold": 3, | |
"httpGet": { | |
"path": "/healthz", | |
"port": 9080, | |
"scheme": "HTTP" | |
}, | |
"initialDelaySeconds": 1, | |
"periodSeconds": 3, | |
"successThreshold": 1, | |
"timeoutSeconds": 1 | |
}, | |
"name": "productpage", | |
"ports": [ | |
{ | |
"containerPort": 9080, | |
"protocol": "TCP" | |
} | |
], | |
"readinessProbe": { | |
"failureThreshold": 3, | |
"httpGet": { | |
"path": "/healthz", | |
"port": 9080, | |
"scheme": "HTTP" | |
}, | |
"initialDelaySeconds": 1, | |
"periodSeconds": 3, | |
"successThreshold": 1, | |
"timeoutSeconds": 1 | |
}, | |
"resources": {}, | |
"terminationMessagePath": "/dev/termination-log", | |
"terminationMessagePolicy": "File" | |
} | |
], | |
"dnsPolicy": "ClusterFirst", | |
"restartPolicy": "Always", | |
"schedulerName": "default-scheduler", | |
"securityContext": {}, | |
"terminationGracePeriodSeconds": 30 | |
} | |
} | |
} | |
} | |
` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment