diff --git a/examples/trivial-service-trace-example/.gitignore b/examples/trivial-service-trace-example/.gitignore new file mode 100644 index 0000000..c695889 --- /dev/null +++ b/examples/trivial-service-trace-example/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/node_modules/ diff --git a/examples/trivial-service-trace-example/Pulumi.yaml b/examples/trivial-service-trace-example/Pulumi.yaml new file mode 100644 index 0000000..1daccf4 --- /dev/null +++ b/examples/trivial-service-trace-example/Pulumi.yaml @@ -0,0 +1,4 @@ +name: trivial-nginx +runtime: nodejs +description: Basic example of an Kubernetes sample based on \ + https://kubernetes.io/docs/user-guide/walkthrough/ diff --git a/examples/trivial-service-trace-example/README.md b/examples/trivial-service-trace-example/README.md new file mode 100644 index 0000000..9402548 --- /dev/null +++ b/examples/trivial-service-trace-example/README.md @@ -0,0 +1,48 @@ +# Example: What happens when a `Service` starts? + +In this example, we: + +- Install a `Deployment` replicating an `nginx` `Pod` 3 times in a Kubernetes cluster. +- Install a `Service` exposing those `nginx` `Pod`s to the Internet. +- Use `kubespy trace` to watch what happens to that `Pod` as it starts. + +You'll need: + +- **Access to a Kubernetes cluster.** If you are using Pulumi, you can + trivially boot an + [GKE](https://github.com/pulumi/examples/tree/master/gcp-ts-gke), + [AKS](https://github.com/pulumi/examples/tree/master/azure-ts-aks-mean), or + [EKS](https://github.com/pulumi/examples/tree/master/aws-ts-eks) cluster. + **NOTE:** If you use [minikube](https://github.com/kubernetes/minikube), + you'll need to change the `Service`'s type to be `ClusterIP`, as minikube + does not support type `LoadBalancer`. +- **Either the Pulumi CLI or `kubectl`.** There is nothing Pulumi-specific in + this example, so you can use `kubectl`, but we hope you'll give Pulumi a + shot! The CLI installation instructions + [here](https://pulumi.io/quickstart/install.html). Pulumi works anywhere + `kubectl` works (i.e., anywhere you have a kubeconfig file), so it should + "just work" if you already have a Kubernetes cluster running. +- **`kubespy`.** Installation is a handful of commands, which you can find in the [README](https://github.com/pulumi/kubespy#installation). + +Once these are complete, you'll want to do two things: + +1. **Run `kubespy`.** Once you've installed it, this should be as simple as + `kubespy status v1 Pod nginx`. `kubespy` will dutifully wait for you to + deploy a `Pod` called `nginx` to your cluster. +2. **Run the example.** `kubespy` repository contains a tiny example Pod that + deploys an NGINX container. + + ```sh + # With Pulumi CLI. + $ git clone git@github.com:pulumi/kubespy.git + $ cd kubespy/examples/trivial-service-trace-example + $ npm install + $ pulumi up + + # With kubectl. + kubectl create -f https://github.com/pulumi/kubespy/raw/master/examples/trivial-service-trace-example/yaml/nginx.yaml + ``` + +Once done, running `kubespy trace service nginx` should display something like this: + +![Changes](../../images/trace/trace-success.gif "Changes a Service undergoes as it starts, in real time") diff --git a/examples/trivial-service-trace-example/index.ts b/examples/trivial-service-trace-example/index.ts new file mode 100644 index 0000000..cf9b315 --- /dev/null +++ b/examples/trivial-service-trace-example/index.ts @@ -0,0 +1,6 @@ +// Copyright 2016-2018, Pulumi Corporation. All rights reserved. + +import * as k8s from "@pulumi/kubernetes"; + +// Create an nginx pod +let nginx = new k8s.yaml.ConfigFile("yaml/nginx.yaml"); diff --git a/examples/trivial-service-trace-example/package-lock.json b/examples/trivial-service-trace-example/package-lock.json new file mode 100644 index 0000000..bfe9f88 --- /dev/null +++ b/examples/trivial-service-trace-example/package-lock.json @@ -0,0 +1,1271 @@ +{ + "name": "nodeserver", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@pulumi/kubernetes": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@pulumi/kubernetes/-/kubernetes-0.17.0.tgz", + "integrity": "sha512-Hv1iEe/J1N2a322cBgW+9EfdkXIlsST3NslIbMgFfAKvf3I12gIm4j0p+Yry/tJA89kcDuDayMPAGtM1+hmYcg==", + "dev": true, + "requires": { + "@pulumi/pulumi": "^0.15.1", + "@types/glob": "^5.0.35", + "@types/js-yaml": "^3.11.2", + "@types/mocha": "^5.2.5", + "@types/tmp": "^0.0.33", + "glob": "^7.1.2", + "js-yaml": "^3.12.0", + "mocha": "^5.2.0", + "shell-quote": "^1.6.1", + "tmp": "^0.0.33" + } + }, + "@pulumi/pulumi": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-0.15.2.tgz", + "integrity": "sha512-mNH8DgGA0DocMmk6F13fakyOhVb+SalZjboJ/iliAz8Uowtwy1sx9woBSONXFM3OhroPWL+BugBpwmMUq4nJpg==", + "requires": { + "google-protobuf": "^3.5.0", + "grpc": "^1.12.2", + "minimist": "^1.2.0", + "normalize-package-data": "^2.4.0", + "protobufjs": "^6.8.6", + "read-package-tree": "^5.2.1", + "require-from-string": "^2.0.1", + "source-map-support": "^0.4.16", + "ts-node": "^7.0.0", + "typescript": "^3.0.0" + }, + "dependencies": { + "typescript": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz", + "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==" + } + } + }, + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "dev": true + }, + "@types/glob": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz", + "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/js-yaml": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.11.2.tgz", + "integrity": "sha512-JRDtMPEqXrzfuYAdqbxLot1GvAr/QvicIZAnOAigZaj8xVMhuSJTg/xsv9E1TvyL+wujYhRLx9ZsQ0oFOSmwyA==", + "dev": true + }, + "@types/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", + "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + }, + "@types/node": { + "version": "9.6.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.31.tgz", + "integrity": "sha512-kIVlvUBizL51ALNMPbmcZoM7quHyB7J6fLRwQe22JsMp39nrVSHdBeVVS3fnQCK1orxI3O8LScmb8cuiihkAfA==", + "dev": true + }, + "@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "~3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + }, + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "google-protobuf": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.6.1.tgz", + "integrity": "sha512-SJYemeX5GjDLPnadcmCNQePQHCS4Hl5fOcI/JawqDIYFhCmrtYAjcx/oTQx/Wi8UuCuZQhfvftbmPePPAYHFtA==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "grpc": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.15.1.tgz", + "integrity": "sha512-BfJ6BpFE93xQW69oYfgVQDxSb7LqdQbnddvhFq4tUsj7s0NAIRrrN3fmN2Bi3qpGFRemsKsWPIchw3YNNq2Xjg==", + "requires": { + "lodash": "^4.17.5", + "nan": "^2.0.0", + "node-pre-gyp": "^0.10.0", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "needle": { + "version": "2.2.2", + "bundled": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + }, + "npm-packlist": { + "version": "1.1.11", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.6", + "bundled": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.10.1.tgz", + "integrity": "sha512-nzsx28VwfaIykfzMAG9TB3jxF5Nn+1/WMKnmVZc8TsB+LMIVvwUscVn7PAq+LFaY5ng5u4jp5mRROSswo76PPA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + } + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", + "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + } + } +} diff --git a/examples/trivial-service-trace-example/package.json b/examples/trivial-service-trace-example/package.json new file mode 100644 index 0000000..d04824a --- /dev/null +++ b/examples/trivial-service-trace-example/package.json @@ -0,0 +1,13 @@ +{ + "name": "nodeserver", + "version": "0.1.0", + "dependencies": { + "@pulumi/pulumi": "^0.15.1" + }, + "devDependencies": { + "@types/node": "^9.3.0", + "@pulumi/kubernetes": "latest", + "typescript": "^2.5.3" + }, + "license": "MIT" +} diff --git a/examples/trivial-service-trace-example/tsconfig.json b/examples/trivial-service-trace-example/tsconfig.json new file mode 100644 index 0000000..3086b63 --- /dev/null +++ b/examples/trivial-service-trace-example/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "outDir": "bin", + "target": "es6", + "module": "commonjs", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "stripInternal": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true, + "strictNullChecks": true + }, + "files": [ + "index.ts" + ] +} diff --git a/examples/trivial-service-trace-example/yaml/nginx.yaml b/examples/trivial-service-trace-example/yaml/nginx.yaml new file mode 100644 index 0000000..8116f67 --- /dev/null +++ b/examples/trivial-service-trace-example/yaml/nginx.yaml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: nginx-deployment +spec: + selector: + matchLabels: + app: nginx + replicas: 3 # tells deployment to run 3 pods matching the template + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 +--- +kind: Service +apiVersion: v1 +metadata: + name: nginx + labels: + app: nginx +spec: + type: LoadBalancer + ports: + - port: 80 + targetPort: 80 + protocol: "TCP" + selector: + app: nginx diff --git a/images/trace/1-trace-success-create-svc.gif b/images/trace/1-trace-success-create-svc.gif new file mode 100644 index 0000000..2e596d1 Binary files /dev/null and b/images/trace/1-trace-success-create-svc.gif differ diff --git a/images/trace/2-trace-success-pods-ready.gif b/images/trace/2-trace-success-pods-ready.gif new file mode 100644 index 0000000..eb40992 Binary files /dev/null and b/images/trace/2-trace-success-pods-ready.gif differ diff --git a/images/trace/3-trace-success-ip-allocated.gif b/images/trace/3-trace-success-ip-allocated.gif new file mode 100644 index 0000000..9b5140a Binary files /dev/null and b/images/trace/3-trace-success-ip-allocated.gif differ diff --git a/images/trace/become-alive.cast b/images/trace/become-alive.cast new file mode 100644 index 0000000..7b5b8f1 --- /dev/null +++ b/images/trace/become-alive.cast @@ -0,0 +1,39 @@ +{"version": 2, "width": 80, "height": 22, "timestamp": 1537899665, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.373823, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r\u001b]2;alex@fabienne-2: ~/go/src/github.com/pulumi/kubespy\u0007\u001b]1;..ulumi/kubespy\u0007"] +[0.427165, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mkubespy\u001b[00m \u001b[01;34mgit:(\u001b[31mhausdorff/trace-svc\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"] +[0.427411, "o", "\u001b[?1h\u001b=\u001b[?2004h"] +[1.011325, "o", "\r\r\nbck-i-search: _\u001b[K\u001b[A\u001b[24C"] +[1.28044, "o", "\u001b[4mk\u001b[24mubespy trace svc nginx\u001b[1B\u001b[48Dk_\u001b[A\u001b[23C"] +[1.470678, "o", "\u001b[4mk\u001b[4mu\u001b[24m\u001b[1B\u001b[26Du_\u001b[A\u001b[22C"] +[1.547293, "o", "\u001b[4mk\u001b[4mu\u001b[4mb\u001b[24m\u001b[1B\u001b[26Db_\u001b[A\u001b[21C"] +[2.04713, "o", "\u001b[24mk\u001b[24mu\u001b[24mb\u001b[1B\r\u001b[K\u001b[A\u001b[39C"] +[2.047375, "o", "\u001b[?1l\u001b>\u001b[?2004l"] +[2.047644, "o", "\u001b[1B\r"] +[2.048421, "o", "\u001b]2;kubespy trace svc nginx\u0007\u001b]1;kubespy\u0007"] +[3.023292, "o", "\u001b[36;1mWaiting for Service 'nginx'\u001b[0m\r\n"] +[3.023376, "o", "\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ❌ Waiting for Endpoints object to be created, to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n❌ Waiting for live Pods to be targeted by service\r\n"] +[3.02435, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lknrz\u001b[0m @ \u001b[33m10.44.6.129\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-rcdlf\u001b[0m @ \u001b[33m10.44.3.165\u001b[0m\r\n"] +[4.778468, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A"] +[4.778551, "o", "\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lknrz\u001b[0m @ \u001b[33m10.44.6.129\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-rcdlf\u001b[0m @ \u001b[33m10.44.3.165\u001b[0m\r\n"] +[5.73934, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K"] +[5.7395, "o", "\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lknrz\u001b[0m @ \u001b[33m10.44.6.129\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-rcdlf\u001b[0m @ \u001b[33m10.44.3.165\u001b[0m\r\n"] +[5.760231, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K"] +[5.760421, "o", "\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-rcdlf\u001b[0m @ \u001b[33m10.44.3.165\u001b[0m\r\n"] +[6.5242, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K"] +[6.524611, "o", "\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-zwljj\u001b[0m @ \u001b[33m10.44.2.220\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-rcdlf\u001b[0m @ \u001b[33m10.44.3.165\u001b[0m\r\n"] +[6.559329, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K"] +[6.559553, "o", "\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-zwljj\u001b[0m @ \u001b[33m10.44.2.220\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n"] +[7.966526, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A"] +[7.966598, "o", "[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-2cwzt\u001b[0m @ \u001b[33m10.44.3.166\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-zwljj\u001b[0m @ \u001b[33m10.44.2.220\u001b[0m\r\n - [\u001b[31;1mNot live\u001b[0m] \u001b[36mnginx-6bfdb7578f-lnsc8\u001b[0m @ \u001b[33m10.44.4.150\u001b[0m\r\n"] +[7.998138, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A"] +[7.99832, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-2cwzt\u001b[0m @ \u001b[33m10.44.3.166\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-zwljj\u001b[0m @ \u001b[33m10.44.2.220\u001b[0m\r\n"] +[8.734086, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A"] +[8.734356, "o", "[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ✅ Service allocated the following IPs/hostnames:\r\n - \u001b[36m35.239.201.100\u001b[0m\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-2cwzt\u001b[0m @ \u001b[33m10.44.3.166\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-qp9v5\u001b[0m @ \u001b[33m10.44.5.139\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-5f59cc6ddd-zwljj\u001b[0m @ \u001b[33m10.44.2.220\u001b[0m\r\n"] +[10.632329, "o", "^C"] +[10.635027, "o", "\r\n"] +[10.635084, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[10.635245, "o", "\u001b]2;alex@fabienne-2: ~/go/src/github.com/pulumi/kubespy\u0007\u001b]1;..ulumi/kubespy\u0007"] +[10.674052, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;31m➜ \u001b[36mkubespy\u001b[00m \u001b[01;34mgit:(\u001b[31mhausdorff/trace-svc\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"] +[10.67411, "o", "\u001b[?1h\u001b="] +[10.674181, "o", "\u001b[?2004h"] +[11.804356, "o", "\u001b[?2004l\r\r\n"] diff --git a/images/trace/become-alive.gif b/images/trace/become-alive.gif new file mode 100644 index 0000000..6d655bb Binary files /dev/null and b/images/trace/become-alive.gif differ diff --git a/images/trace/trace-success.cast b/images/trace/trace-success.cast new file mode 100644 index 0000000..8e23494 --- /dev/null +++ b/images/trace/trace-success.cast @@ -0,0 +1,29 @@ +{"version": 2, "width": 80, "height": 22, "timestamp": 1537898587, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.278894, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r\u001b]2;alex@fabienne-2: ~/go/src/github.com/pulumi/kubespy\u0007"] +[0.279883, "o", "\u001b]1;..ulumi/kubespy\u0007"] +[0.322686, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36mkubespy\u001b[00m \u001b[01;34mgit:(\u001b[31mhausdorff/trace-svc\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"] +[0.32296, "o", "\u001b[?1h\u001b=\u001b[?2004h"] +[0.885793, "o", "\r\r\nbck-i-search: _\u001b[K\u001b[A\u001b[24C"] +[1.059909, "o", "\u001b[4mk\u001b[24mubespy trace svc nginx\u001b[1B\u001b[48Dk_\u001b[A\u001b[23C"] +[1.273806, "o", "\u001b[4mk\u001b[4mu\u001b[24m\u001b[1B\u001b[26Du_\u001b[A\u001b[22C"] +[1.328081, "o", "\u001b[4mk\u001b[4mu\u001b[4mb\u001b[24m\u001b[1B\u001b[26Db_\u001b[A\u001b[21C"] +[2.131179, "o", "\u001b[24mk\u001b[24mu\u001b[24mb\u001b[1B\r\u001b[K\u001b[A\u001b[39C"] +[2.131241, "o", "\u001b[?1l\u001b>"] +[2.131467, "o", "\u001b[?2004l\u001b[1B\r"] +[2.132223, "o", "\u001b]2;kubespy trace svc nginx\u0007\u001b]1;kubespy\u0007"] +[3.098252, "o", "\u001b[36;1mWaiting for Service 'nginx'\u001b[0m\r\n"] +[3.858426, "o", "\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ❌ Waiting for Endpoints object to be created, to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n❌ Waiting for live Pods to be targeted by service\r\n"] +[3.862946, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ❌ Does not direct traffic to any Pods\r\n"] +[4.634172, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-v66vj\u001b[0m @ \u001b[33m10.44.7.148\u001b[0m\r\n"] +[5.246059, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-fzg2g\u001b[0m @ \u001b[33m10.44.2.219\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-v66vj\u001b[0m @ \u001b[33m10.44.7.148\u001b[0m\r\n"] +[5.248011, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mADDED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ❌ Waiting for public IP/host to be allocated\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-fzg2g\u001b[0m @ \u001b[33m10.44.2.219\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-k9x22\u001b[0m @ \u001b[33m10.44.6.124\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-v66vj\u001b[0m @ \u001b[33m10.44.7.148\u001b[0m\r\n"] +[7.273421, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A"] +[7.273861, "o", "\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2K\u001b[1A[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Service\u001b[0m] default/nginx\r\n ✅ Successfully created Endpoints object 'nginx' to direct traffic to Pods\r\n ✅ Service allocated the following IPs/hostnames:\r\n - \u001b[36m35.188.135.181\u001b[0m\r\n\r\n[\u001b[32mMODIFIED\u001b[0m \u001b[36;1mv1/Endpoints\u001b[0m] default/nginx\r\n ✅ Directs traffic to the following live Pods:\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-fzg2g\u001b[0m @ \u001b[33m10.44.2.219\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-k9x22\u001b[0m @ \u001b[33m10.44.6.124\u001b[0m\r\n - [\u001b[32mReady\u001b[0m] \u001b[36mnginx-58687b6766-v66vj\u001b[0m @ \u001b[33m10.44.7.148\u001b[0m\r\n"] +[9.513146, "o", "^C"] +[9.515921, "o", "\r\n"] +[9.516107, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[9.516256, "o", "\u001b]2;alex@fabienne-2: ~/go/src/github.com/pulumi/kubespy\u0007\u001b]1;..ulumi/kubespy\u0007"] +[9.552787, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;31m➜ \u001b[36mkubespy\u001b[00m \u001b[01;34mgit:(\u001b[31mhausdorff/trace-svc\u001b[34m) \u001b[33m✗\u001b[00m \u001b[K"] +[9.552843, "o", "\u001b[?1h\u001b="] +[9.552996, "o", "\u001b[?2004h"] +[10.125099, "o", "\u001b[?2004l\r\r\n"] diff --git a/images/trace/trace-success.gif b/images/trace/trace-success.gif new file mode 100644 index 0000000..b37948f Binary files /dev/null and b/images/trace/trace-success.gif differ