Skip to content
This repository has been archived by the owner on Feb 6, 2024. It is now read-only.

Commit

Permalink
This splits and reverses a multi-document yaml for k8s_object delete. (
Browse files Browse the repository at this point in the history
…#110)

* This splits and reverses a multi-document yaml for k8s_object delete.

Fixes: #109
  • Loading branch information
mattmoor committed Feb 8, 2018
1 parent 57fa545 commit d413b49
Show file tree
Hide file tree
Showing 9 changed files with 246 additions and 10 deletions.
7 changes: 7 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ _CLUSTER = "gke_rules-k8s_us-central1-f_testing"

_NAMESPACE = "{BUILD_USER}"

k8s_defaults(
name = "k8s_object",
cluster = _CLUSTER,
image_chroot = "us.gcr.io/rules_k8s/{BUILD_USER}",
namespace = _NAMESPACE,
)

k8s_defaults(
name = "k8s_deploy",
cluster = _CLUSTER,
Expand Down
18 changes: 18 additions & 0 deletions examples/todocontroller/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,21 @@ k8s_todo(
name = "example-todo",
template = ":example.yaml",
)

load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")

k8s_objects(
name = "everything",
objects = [
# Create the CRD first.
":todo-crd",
":example-todo",
],
)

load("@k8s_object//:defaults.bzl", "k8s_object")

k8s_todo(
name = "joined",
template = ":joined.yaml",
)
14 changes: 14 additions & 0 deletions examples/todocontroller/e2e-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,20 @@ function delete() {
bazel-bin/examples/todocontroller/${LANGUAGE}/staging.delete
}

function check_reverse_delete_k8s_object() {
echo Checking deletion in reverse order via k8s_object.
bazel run examples/todocontroller:joined.apply
bazel run examples/todocontroller:joined.delete
}

function check_reverse_delete_k8s_objects() {
echo Checking deletion in reverse order via k8s_objects.
bazel run examples/todocontroller:everything.apply
bazel run examples/todocontroller:everything.delete
}

check_reverse_delete_k8s_object
check_reverse_delete_k8s_objects

create
trap "delete" EXIT
Expand Down
69 changes: 69 additions & 0 deletions examples/todocontroller/joined.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata: {name: todos.rules-k8s.bazel.io}
spec:
group: rules-k8s.bazel.io
names: {kind: Todo, plural: todos, singular: todo}
scope: Namespaced
version: v1

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo1}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo2}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo3}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo4}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo5}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo6}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo7}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo8}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo9}
spec: {done: false, subject: Do something}

---
apiVersion: rules-k8s.bazel.io/v1
kind: Todo
metadata: {name: my-todo10}
spec: {done: false, subject: Do something}

8 changes: 8 additions & 0 deletions k8s/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ exports_files([
"replace.sh.tpl",
"resolve.sh.tpl",
"resolve-all.sh.tpl",
"reverse.sh.tpl",
"delete.sh.tpl",
"describe.sh.tpl",
])
Expand Down Expand Up @@ -65,3 +66,10 @@ par_binary(
main = "stamper.py",
visibility = ["//visibility:public"],
)

par_binary(
name = "reverser",
srcs = ["reverser.py"],
main = "reverser.py",
visibility = ["//visibility:public"],
)
3 changes: 2 additions & 1 deletion k8s/delete.sh.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,5 @@ function guess_runfiles() {

RUNFILES="${PYTHON_RUNFILES:-$(guess_runfiles)}"

kubectl --cluster="%{cluster}" %{namespace_arg} delete -f %{unresolved}
PYTHON_RUNFILES=${RUNFILES} %{reverse_script} | \
kubectl --cluster="%{cluster}" %{namespace_arg} delete -f -
67 changes: 58 additions & 9 deletions k8s/object.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,11 @@ def _common_impl(ctx):
files += [ctx.executable.resolved]
files += list(ctx.attr.resolved.default_runfiles.files)

if hasattr(ctx.executable, "reversed"):
substitutions["%{reverse_script}"] = _runfiles(ctx, ctx.executable.reversed)
files += [ctx.executable.reversed]
files += list(ctx.attr.reversed.default_runfiles.files)

if hasattr(ctx.files, "unresolved"):
substitutions["%{unresolved}"] = _runfiles(ctx, ctx.file.unresolved)
files += ctx.files.unresolved
Expand Down Expand Up @@ -200,6 +205,52 @@ _common_attrs = {
),
}

def _reverse(ctx):
"""Implementation of _reversed."""
ctx.actions.expand_template(
template = ctx.file._template,
substitutions = {
"%{reverser}": _runfiles(ctx, ctx.executable.reverser),
"%{yaml}": _runfiles(ctx, ctx.file.template),
},
output = ctx.outputs.executable,
)

return struct(runfiles = ctx.runfiles(files = [
ctx.executable.reverser,
ctx.file.template,
] + list(ctx.attr.reverser.default_runfiles.files)))

_reversed = rule(
attrs = _add_dicts(
{
"template": attr.label(
allow_files = [
".yaml",
".json",
],
single_file = True,
mandatory = True,
),
"reverser": attr.label(
default = Label("//k8s:reverser"),
cfg = "host",
executable = True,
allow_files = True,
),
"_template": attr.label(
default = Label("//k8s:reverse.sh.tpl"),
single_file = True,
allow_files = True,
),
},
_common_attrs,
_layer_tools,
),
executable = True,
implementation = _reverse,
)

_k8s_object = rule(
attrs = _add_dicts(
{
Expand Down Expand Up @@ -314,13 +365,10 @@ _k8s_object_describe = rule(
_k8s_object_delete = rule(
attrs = _add_dicts(
{
"unresolved": attr.label(
allow_files = [
".yaml",
".json",
],
single_file = True,
mandatory = True,
"reversed": attr.label(
cfg = "target",
executable = True,
allow_files = True,
),
"_template": attr.label(
default = Label("//k8s:delete.sh.tpl"),
Expand All @@ -344,20 +392,21 @@ def k8s_object(name, **kwargs):
template: the yaml template to instantiate.
images: a dictionary from fully-qualified tag to label.
"""
for reserved in ["image_targets", "image_target_strings", "resolved"]:
for reserved in ["image_targets", "image_target_strings", "resolved", "reversed"]:
if reserved in kwargs:
fail("reserved for internal use by docker_bundle macro", attr=reserved)

kwargs["image_targets"] = _deduplicate(kwargs.get("images", {}).values())
kwargs["image_target_strings"] = _deduplicate(kwargs.get("images", {}).values())

_k8s_object(name=name, **kwargs)
_reversed(name=name + ".reversed", template=kwargs.get("template"))

if "cluster" in kwargs:
_k8s_object_create(name=name + ".create", resolved=name,
kind=kwargs.get("kind"), cluster=kwargs.get("cluster"),
namespace=kwargs.get("namespace"))
_k8s_object_delete(name=name + ".delete", unresolved=kwargs.get("template"),
_k8s_object_delete(name=name + ".delete", reversed=name + ".reversed",
kind=kwargs.get("kind"), cluster=kwargs.get("cluster"),
namespace=kwargs.get("namespace"))
_k8s_object_replace(name=name + ".replace", resolved=name,
Expand Down
26 changes: 26 additions & 0 deletions k8s/reverse.sh.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/bin/bash

# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -euo pipefail

function guess_runfiles() {
pushd ${BASH_SOURCE[0]}.runfiles > /dev/null 2>&1
pwd
popd > /dev/null 2>&1
}

RUNFILES="${PYTHON_RUNFILES:-$(guess_runfiles)}"

%{reverser} --template %{yaml}
44 changes: 44 additions & 0 deletions k8s/reverser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Reverses the object order in a multi-document yaml."""

from __future__ import print_function

import argparse


parser = argparse.ArgumentParser(
description='Reverse a potential multi-document input.')

parser.add_argument(
'--template', action='store',
help='The template file to resolve.')

_DOCUMENT_DELIMITER = '---\n'


def main():
args = parser.parse_args()

with open(args.template, 'r') as f:
inputs = f.read()

content = _DOCUMENT_DELIMITER.join(
reversed(inputs.split(_DOCUMENT_DELIMITER)))

print(content)


if __name__ == '__main__':
main()

0 comments on commit d413b49

Please sign in to comment.