#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with`
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

source $(dirname $0)/eagle-env.sh
eagle_bin=$EAGLE_HOME/bin

#####################################################################
#            Import stream metadata for HDFS
#####################################################################

## AlertDataSource: data sources bound to sites
echo "Importing AlertDataSourceService for persist... "

curl -u ${EAGLE_SERVICE_USER}:${EAGLE_SERVICE_PASSWD} -X POST -H 'Content-Type:application/json' \
 "http://${EAGLE_SERVICE_HOST}:${EAGLE_SERVICE_PORT}/eagle-service/rest/entities?serviceName=AlertDataSourceService" \
  -d '[{"prefix":"alertDataSource","tags":{"site" : "sandbox", "dataSource":"persistTest"}, "enabled": "true", "config" : " just some description", "desc":"persistTest"}]'


## AlertStreamService: alert streams generated from data source
echo ""
echo "Importing AlertStreamService for HDFS... "
curl -u ${EAGLE_SERVICE_USER}:${EAGLE_SERVICE_PASSWD} -X POST -H 'Content-Type:application/json' \
 "http://${EAGLE_SERVICE_HOST}:${EAGLE_SERVICE_PORT}/eagle-service/rest/entities?serviceName=AlertStreamService" \
 -d '[{"prefix":"alertStream","tags":{"dataSource":"persistTest","streamName":"persistTestEventStream"},"desc":"persistTest metrics"}]'

## AlertExecutorService: what alert streams are consumed by alert executor
echo ""
echo "Importing AlertExecutorService for HDFS... "
curl -u ${EAGLE_SERVICE_USER}:${EAGLE_SERVICE_PASSWD} -X POST -H 'Content-Type:application/json' \
 "http://${EAGLE_SERVICE_HOST}:${EAGLE_SERVICE_PORT}/eagle-service/rest/entities?serviceName=AlertExecutorService" \
 -d '[{"prefix":"alertExecutor","tags":{"dataSource":"persistTest","alertExecutorId":"aggregateExecutor1","streamName":"persistTestEventStream"},"desc":"aggregate executor for persist test log event stream"}]'

## AlertStreamSchemaService: schema for event from alert stream
echo ""
echo "Importing AlertStreamSchemaService for HDFS... "
curl -u ${EAGLE_SERVICE_USER}:${EAGLE_SERVICE_PASSWD} -X POST -H 'Content-Type:application/json' \
"http://${EAGLE_SERVICE_HOST}:${EAGLE_SERVICE_PORT}/eagle-service/rest/entities?serviceName=AlertStreamSchemaService" \
 -d '
 [
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "src"
       },
       "attrDescription": "source directory or file, such as /tmp",
       "attrType": "string",
       "category": "",
       "attrValueResolver": "org.apache.eagle.service.security.hdfs.resolver.HDFSResourceResolver"
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "dst"
       },
       "attrDescription": "destination directory, such as /tmp",
       "attrType": "string",
       "category": "",
       "attrValueResolver": "org.apache.eagle.service.security.hdfs.resolver.HDFSResourceResolver"
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "host"
       },
       "attrDescription": "hostname, such as localhost",
       "attrType": "string",
       "category": "",
       "attrValueResolver": ""
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "timestamp"
       },
       "attrDescription": "milliseconds of the datetime",
       "attrType": "long",
       "category": "",
       "attrValueResolver": ""
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "allowed"
       },
       "attrDescription": "true, false or none",
       "attrType": "bool",
       "category": "",
       "attrValueResolver": ""
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "user"
       },
       "attrDescription": "process user",
       "attrType": "string",
       "category": "",
       "attrValueResolver": ""
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "cmd"
       },
       "attrDescription": "file/directory operation, such as getfileinfo, open, listStatus and so on",
       "attrType": "string",
       "category": "",
       "attrValueResolver": "org.apache.eagle.service.security.hdfs.resolver.HDFSCommandResolver"
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "sensitivityType"
       },
       "attrDescription": "mark such as AUDITLOG, SECURITYLOG",
       "attrType": "string",
       "category": "",
       "attrValueResolver": "org.apache.eagle.service.security.hdfs.resolver.HDFSSensitivityTypeResolver"
    },
    {
       "prefix": "alertStreamSchema",
       "tags": {
          "dataSource": "persistTest",
          "streamName": "persistTestEventStream",
          "attrName": "securityZone"
       },
       "attrDescription": "",
       "attrType": "string",
       "category": "",
       "attrValueResolver": ""
    }
 ]
 '

##### add policies ##########
echo ""
echo "Importing AlertStreamSchemaService for HDFS... "
curl -u ${EAGLE_SERVICE_USER}:${EAGLE_SERVICE_PASSWD} -X POST -H 'Content-Type:application/json' \
 "http://${EAGLE_SERVICE_HOST}:${EAGLE_SERVICE_PORT}/eagle-service/rest/entities?serviceName=AggregateDefinitionService" \
 -d '
 [
     {
       "prefix": "aggregatedef",
       "tags": {
         "site": "sandbox",
         "dataSource": "persistTest",
         "policyId": "persitTestPolicy1",
         "executorId": "aggregateExecutor1",
         "policyType": "siddhiCEPEngine"
       },
       "description": "persistetest",
       "policyDef": "{\"expression\":\"from persistTestEventStream[(logLevel == 'ERROR')] select * insert into outputStream;\",\"type\":\"siddhiCEPEngine\"}",
       "enabled": true
     }
 ]
 '



 ## Finished
echo ""
echo "Finished initialization for eagle topology"

exit 0
