From 76af69c8f49d7d4479334d77e22d3fc9790de0eb Mon Sep 17 00:00:00 2001
From: Angus Lees <gus@inodes.org>
Date: Fri, 16 Jun 2017 12:44:33 +1000
Subject: [PATCH] Provide guestbook.jsonnet example

Update example to use something self-contained.

Add diff,delete to the quickstart example
---
 README.md                  | 30 ++++++++------
 examples/example.libsonnet | 52 +++++++++++++++++++++++++
 examples/guestbook.jsonnet | 80 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 150 insertions(+), 12 deletions(-)
 create mode 100644 examples/example.libsonnet
 create mode 100644 examples/guestbook.jsonnet

diff --git a/README.md b/README.md
index bd5edf91..40073234 100644
--- a/README.md
+++ b/README.md
@@ -37,25 +37,31 @@ avoid an immediate `Killed: 9`.
 ## Quickstart
 
 ```console
-# This example uses ksonnet-lib
-% git clone https://github.com/ksonnet/ksonnet-lib.git
+# Fetch guestbook example
+% git clone https://github.com/ksonnet/kubecfg.git
+% cd kubecfg
 
-# Set kubecfg/jsonnet library search path.  Can also use `-J` args everywhere.
-% export KUBECFG_JPATH=$PWD/ksonnet-lib
-
-# Hello-world ksonnet-lib example
-% cd ksonnet-lib/examples/readme
+# Set kubecfg/jsonnet library search path to <kubecfg.git>/lib.
+# Can also use explicit `-J` args everywhere.
+% export KUBECFG_JPATH=$PWD/lib
 
 # Show generated YAML
-% kubecfg show -o yaml hello-nginx.jsonnet 
+% kubecfg show -o yaml examples/guestbook.jsonnet
 
 # Create resources
-% kubecfg update hello-nginx.jsonnet
+% kubecfg update examples/guestbook.jsonnet
+
+# Modify configuration (downgrade gb-frontend image)
+% sed -i.bak '\,gcr.io/google-samples/gb-frontend,s/:v4/:v3/' examples/guestbook.jsonnet
+# See differences vs server
+% kubecfg diff examples/guestbook.jsonnet
 
-# Modify configuration
-% sed -ie 's/nginx:1.7.9/nginx:1.13.0/' hello-nginx.jsonnet
 # Update to new config
-% kubecfg update hello-nginx.jsonnet
+% kubecfg update examples/guestbook.jsonnet
+
+# Clean up after demo
+% kubecfg delete examples/guestbook.jsonnet
+% mv examples/guestbook.jsonnet.bak examples/guestbook.jsonnet
 ```
 
 ## Features
diff --git a/examples/example.libsonnet b/examples/example.libsonnet
new file mode 100644
index 00000000..2a02f3bc
--- /dev/null
+++ b/examples/example.libsonnet
@@ -0,0 +1,52 @@
+// This library is intended to support kubecfg examples, and should
+// not necessarily be considered recommended jsonnet structure.
+
+local kubecfg = import "kubecfg.libsonnet";
+
+{
+  service(name):: {
+    local this = self,
+
+    apiVersion: "v1",
+    kind: "Service",
+    metadata: {
+      name: name,
+      labels: { name: name },
+    },
+
+    targetPod_:: error "targetPod_ required in this usage",
+    spec: {
+      ports: [{port: p.containerPort}
+              for p in this.targetPod_.spec.containers[0].ports],
+      selector: this.targetPod_.metadata.labels,
+    }},
+
+  container(name, image):: {
+    local this = self,
+
+    name: name,
+    image: kubecfg.resolveImage(image),
+
+    env_:: {},  // key/value version of `env` (hidden)
+    env: [{name: k, value: this.env_[k]} for k in std.objectFields(this.env_)],
+
+    ports: [],
+  },
+
+  deployment(name):: {
+    local this = self,
+
+    apiVersion: "extensions/v1beta1",
+    kind: "Deployment",
+    metadata: {
+      name: name,
+      labels: { name: name },
+    },
+    spec: {
+      replicas: 1,
+      template: {
+        metadata: { labels: this.metadata.labels },
+        spec: {
+          containers: []
+        }}}},
+}
diff --git a/examples/guestbook.jsonnet b/examples/guestbook.jsonnet
new file mode 100644
index 00000000..4fe31ba8
--- /dev/null
+++ b/examples/guestbook.jsonnet
@@ -0,0 +1,80 @@
+// Simple self-contained example to demonstrate kubecfg.
+// This should not necessarily be considered a model jsonnet example
+// to build upon.
+
+// This is a simple port to jsonnet of the standard guestbook example
+// https://github.com/kubernetes/kubernetes/tree/master/examples/guestbook
+//
+// Expects to be run with ../lib in the jsonnet search path:
+// ```
+// export KUBECFG_JPATH=$PWD/../lib
+// kubecfg update guestbook.jsonnet
+// # poke at $(minikube service --url frontend), etc
+// kubecfg delete guestbook.jsonnet
+// ```
+
+local example = import "example.libsonnet";
+
+{
+  frontend_deployment: example.deployment("frontend") {
+    spec+: {
+      replicas: 3,
+      template+: {
+        spec+: {
+          containers: [
+            example.container(
+              "php-redis", "gcr.io/google-samples/gb-frontend:v4"
+            ) {
+              resources: {
+                requests: { cpu: "100m", memory: "100Mi" },
+              },
+              env_: {
+                GET_HOSTS_FROM: "dns",
+              },
+              ports: [{containerPort: 80}],
+            }]}}}},
+
+  frontend_service: example.service("frontend") {
+    targetPod_: $.frontend_deployment.spec.template,
+  },
+
+  redis_master_deployment: example.deployment("redis-master") {
+    spec+: {
+      template+: {
+        spec+: {
+          containers: [
+            example.container(
+              "master", "gcr.io/google_containers/redis:e2e"
+            ) {
+              resources: {
+                requests: { cpu: "100m", memory: "100Mi" },
+              },
+              ports: [{containerPort: 6379}],
+            }]}}}},
+
+  redis_master_service: example.service("redis-master") {
+    targetPod_: $.redis_master_deployment.spec.template,
+  },
+
+  redis_slave_deployment: example.deployment("redis-slave") {
+    spec+: {
+      replicas: 2,
+      template+: {
+        spec+: {
+          containers: [
+            example.container(
+              "slave", "gcr.io/google_samples/gb-redisslave:v1"
+            ) {
+              resources: {
+                requests: { cpu: "100m", memory: "100Mi" },
+              },
+              env_: {
+                GET_HOSTS_FROM: "dns",
+              },
+              ports: [{containerPort: 6379}],
+            }]}}}},
+
+  redis_slave_service: example.service("redis-slave") {
+    targetPod_: $.redis_slave_deployment.spec.template,
+  },
+}
-- 
GitLab