#!/usr/bin/env python

import sys, os

SCENARIO_HEADER = '''
<!--
  ~ Copyright 2019-present Open Networking Foundation
  ~
  ~ 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.
  -->
  
  <!--
     This scenario is auto generated by onos-generate-activate-all-scenario. DO NOT EDIT
  -->
  <scenario name="app-activate-all" description="Tests that all apps can be activated by themselves">
    <group name="App-Activate-All">
       <step name="App-Activate-All.Minimal-Apps"
                 exec="onos-set-up-minimal-apps ${OCI}"/>
       <step name="App-Activate-All.Count-Components" 
             exec="onos-find-component-count ${OC1} starting" requires="^"/>
'''

SCENARIO_FOOTER = '''
    </group>
  </scenario>
'''

ACTIVATE_GROUP_TEMPLATE = '''
        <group name="App-Activate-All.%(app_id)s" %(requires)s>
           <step name="App-Activate-All.Activate-%(app_id)s"
                 exec="onos ${OCI} app activate org.onosproject.%(app_id)s" %(requires)s/>
           <group name="App-Activate-All.App-Check-%(app_id)s" requires="App-Activate-All.Activate-%(app_id)s">
              <parallel var="${OC#}">
                 <step name="App-Activate-All.App-Check-${#}-%(app_id)s"
                       exec="onos-check-apps ${OC#} %(app_id)s includes"/>
                 <step name="App-Activate-All.Check-Logs-${#}-%(app_id)s" exec="onos-check-logs ${OC#}"/>
              </parallel>
           </group>
           <step name="App-Activate-All.App-Deactivate-%(app_id)s"
                 exec="onos ${OCI} app deactivate org.onosproject.%(app_id)s" requires="App-Activate-All.App-Check-%(app_id)s"/>
           <step name="App-Activate-All.Wait-For-Deactivate-%(app_id)s"
                 exec="onos-check-component-count ${OCI} ${startingcount}" requires="App-Activate-All.App-Deactivate-%(app_id)s"/>      
           <group name="App-Activate-All.App-Check-After-%(app_id)s" requires="App-Activate-All.Wait-For-Deactivate-%(app_id)s">
              <parallel var="${OC#}">
                 <step name="App-Activate-All.Check-Logs-After-${#}-%(app_id)s" exec="onos-check-logs ${OC#}"/>
              </parallel>
           </group>
           <step name="App-Activate-All.Minimal-Apps-%(app_id)s" requires="App-Activate-All.App-Deactivate-%(app_id)s"
                 exec="onos-set-up-minimal-apps ${OCI}"/>
        </group>

'''

app_list = []
app_list_file = ""

if len(sys.argv) > 1:
    app_list_file = sys.argv[1]
else:
    print "Usage: onos-generate-activate-all-scenario file-name-of-app-list"
    sys.exit()

with open(app_list_file) as apps:
    for app in apps:
        if not "#" in app:
            normalized_app = app.strip(" \n")
            if not normalized_app == "":
                app_list.append(normalized_app)

scenario = SCENARIO_HEADER + "\n"

app_group_requires = 'requires="App-Activate-All.Minimal-Apps"'
for app_id in app_list:
    parameters = {
        'requires': app_group_requires,
        'app_id': app_id,
    }
    scenario = scenario + (ACTIVATE_GROUP_TEMPLATE % parameters)
    app_group_requires = 'requires="App-Activate-All.' + app_id + '"'

scenario = scenario + SCENARIO_FOOTER

print scenario

