marketplace/deployer_util/set_app_labels.py (51 lines of code) (raw):
#!/usr/bin/env python3
#
# Copyright 2018 Google LLC
#
# 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.
import os
import sys
from argparse import ArgumentParser
import yaml
from yaml_util import load_resources_yaml
from yaml_util import parse_resources_yaml
_PROG_HELP = """
Sets the app.kubernetes.io labels on resources.
"""
def main():
parser = ArgumentParser(description=_PROG_HELP)
parser.add_argument(
"--manifests",
help="The folder containing the manifest templates, "
"or - to read from stdin",
required=True)
parser.add_argument(
"--dest",
help="The output file for the resulting manifest, "
"or - to write to stdout",
required=True)
parser.add_argument(
"--name", help="The name of the application instance", required=True)
parser.add_argument(
"--namespace",
help="The namespace where the application is installed",
required=True)
args = parser.parse_args()
resources = []
if args.manifests == "-":
resources = parse_resources_yaml(sys.stdin.read())
elif os.path.isfile(args.manifests):
resources = load_resources_yaml(args.manifests)
else:
resources = []
for filename in os.listdir(args.manifests):
resources += load_resources_yaml(os.path.join(args.manifests, filename))
# Modify resources inlined.
for resource in resources:
labels = resource['metadata'].get('labels', {})
resource['metadata']['labels'] = labels
labels['app.kubernetes.io/name'] = args.name
# For a resource that doesn't have a namespace (i.e. cluster resource),
# also all label it with the namespace of the application.
if 'namespace' not in resource['metadata']:
labels['app.kubernetes.io/namespace'] = args.namespace
if args.dest == "-":
write_resources(resources, sys.stdout)
sys.stdout.flush()
else:
with open(args.dest, "w", encoding='utf-8') as outfile:
write_resources(resources, outfile)
def write_resources(resources, outfile):
yaml.safe_dump_all(resources, outfile, default_flow_style=False, indent=2)
if __name__ == "__main__":
main()