#!/usr/bin/env bash

# Copyright 2019 Samsung Electronics Co., Ltd.
#
# 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.

#
# Gather information on ONAP cluster required by security tests.
# Copy results to Robot pod.
#


TMPDIR='/tmp'
TMPTPL='onap_security'
CSV2JSON='import csv; import json; import sys; print(json.dumps({i[0]: i[1] for i in csv.reader(sys.stdin)}))'
FILTER="$(tr -d [:space:] <<TEMPLATE
{{range .items}}
    {{range.spec.ports}}
        {{if .nodePort}}
            {{.nodePort}}{{','}}{{.name}}{{'\n'}}
        {{end}}
    {{end}}
{{end}}
TEMPLATE)"


setup () {
    export NODEPORTS_FILE="$(mktemp -p ${TMPDIR} ${TMPTPL}XXX)"
}

create_actual_nodeport_json () {
    kubectl get svc -n $NAMESPACE -o go-template="$FILTER" | python3 -c "$CSV2JSON" > "$NODEPORTS_FILE"
}

copy_actual_nodeport_json_to_robot () {
    kubectl cp "$1" "$2/$3:$4"
}

cleanup () {
    rm "$NODEPORTS_FILE"
}


setup
create_actual_nodeport_json
copy_actual_nodeport_json_to_robot "$NODEPORTS_FILE" "$NAMESPACE" "$POD" "$TMPDIR"
cleanup
