UC02: added execution controls and global variables 19/53719/2
authorGerard Damm <gerard.damm@wipro.com>
Tue, 13 Mar 2018 20:06:56 +0000 (15:06 -0500)
committerGerard Damm <gerard.damm@wipro.com>
Wed, 14 Mar 2018 15:19:29 +0000 (10:19 -0500)
JIRA: Auto-13

removed trailing spaces in all files

Change-Id: I3eea80f7bc5dd0a018b5a3845d5071a6389a9477
Signed-off-by: Gerard Damm <gerard.damm@wipro.com>
lib/auto/testcase/resiliency/AutoResilGlobal.py [new file with mode: 0644]
lib/auto/testcase/resiliency/AutoResilIftCloud.py
lib/auto/testcase/resiliency/AutoResilItfOS.py
lib/auto/testcase/resiliency/AutoResilItfVNFMNFVO.py
lib/auto/testcase/resiliency/AutoResilMain.py
lib/auto/testcase/resiliency/AutoResilMgTestDef.py
lib/auto/testcase/resiliency/AutoResilRunTest.py

diff --git a/lib/auto/testcase/resiliency/AutoResilGlobal.py b/lib/auto/testcase/resiliency/AutoResilGlobal.py
new file mode 100644 (file)
index 0000000..1a59f4b
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+
+# ===============LICENSE_START=======================================================
+# Apache-2.0
+# ===================================================================================
+# Copyright (C) 2018 Wipro. 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.
+# ===============LICENSE_END=========================================================
+
+
+# OPNFV Auto project
+# https://wiki.opnfv.org/pages/viewpage.action?pageId=12389095
+
+# Use case 02: Resilience Improvements
+# Use Case description: https://wiki.opnfv.org/display/AUTO/Auto+Use+Cases
+# Test case design: https://wiki.opnfv.org/display/AUTO/Use+case+2+%28Resilience+Improvements+through+ONAP%29+analysis
+
+# This module: global variables (list of definition data)
+
+#docstring
+"""This module contains global variable for OPNFV Auto Test Data for Use Case 2: Resilience Improvements Through ONAP.
+Auto project: https://wiki.opnfv.org/pages/viewpage.action?pageId=12389095
+"""
+
+
+######################################################################
+# import statements
+
+
+# global variables
+test_case_list =                None
+test_definition_list =          None
+recipient_list =                None
+challenge_definition_list =     None
+metric_definition_list =        None
+physical_resource_list =        None
+cloud_virtual_resource_list =   None
+VNF_Service_list =              None
+
index bca8b95..01e948b 100644 (file)
 # This module: interfaces with cloud managers (OpenStack, Kubernetes, AWS, ...)
 
 
+######################################################################
+# import statements
+import AutoResilGlobal
+
 
 def f1():
     return 0
 
-
-
+# OpenStack HTTP API: https://developer.openstack.org/api-ref/compute/
+#{your_compute_service_url}/servers/{server_id}/action
+#GET
+#http://mycompute.pvt/compute/v2.1/servers/{server_id}/suspend
+#http://mycompute.pvt/compute/v2.1/servers/{server_id}/resume
 
index 2fc6c85..5f792f6 100644 (file)
 # This module: interfaces with OS, or servers
 
 
+######################################################################
+# import statements
+import AutoResilGlobal
+
+
 def f1():
     return 0
 
index b6b1745..494d0ab 100644 (file)
@@ -30,6 +30,9 @@
 # This module: interfaces with VNF/NVF managers (focus on ONAP)
 #     entities that manage VNFs and orchestrates services (VNF-M and NFV-O)
 
+######################################################################
+# import statements
+import AutoResilGlobal
 
 def f1():
     return 0
index a69e777..03e7151 100644 (file)
@@ -37,7 +37,7 @@
 
 
 #docstring
-""" This is the main module for OPNFV Auto Test Data for Use Case 2: Resilience Improvements Through ONAP.
+"""This is the main module for OPNFV Auto Test Data for Use Case 2: Resilience Improvements Through ONAP.
 Auto project: https://wiki.opnfv.org/pages/viewpage.action?pageId=12389095
 """
 
@@ -46,6 +46,7 @@ Auto project: https://wiki.opnfv.org/pages/viewpage.action?pageId=12389095
 
 ######################################################################
 # import statements
+import AutoResilGlobal
 from AutoResilMgTestDef import *
 
 # Constants
@@ -53,53 +54,58 @@ PROJECT_NAME = "Auto"
 USE_CASE_NAME = "Resilience Improvements Through ONAP"
 
 
+
 ######################################################################
 
 def show_menu(selected_test_def_ID):
-    print("Project ", PROJECT_NAME, ", Use Case: ",USE_CASE_NAME)
+    """Show menu, with a different first line based on current Test Definition selection."""
+
     if selected_test_def_ID>0 :
-        print("Current test Definition ID: ",selected_test_def_ID)
+        print("\nCurrently selected test Definition ID: ",selected_test_def_ID)
     else:
-        print("Current test Definition ID: (none)")
+        print("\nCurrently selected test Definition ID: (none)")
     print("1: select Test Definition ID")
-    print("2: view current Test Definition details")
-    print("3: start an execution of current Test Definition")
+    print("2: view currently selected Test Definition details")
+    print("3: start an execution of currently selected Test Definition")
     print("4: exit")
 
 
 def get_menu_choice():
-
+    """Get a user input (a menu entry number)."""
     while True:
         try:
             user_choice = int(input("  Choice: "))
         except ValueError:
-            print("Invalid choice (must be an integer). Try again.")
+            print("  Invalid choice (must be an integer). Try again.")
             continue
         if user_choice < 1 or user_choice > 4:
-            print("Invalid choice (must be between 1 and 4). Try again.")
+            print("  Invalid choice (must be between 1 and 4). Try again.")
             continue
         else:
             return user_choice
 
 
 def get_test_def_ID():
-
+    """Get a user input (a test definition ID)."""
     while True:
         try:
-            user_test_def_ID = int(input("  Test Definition ID: "))
+            user_test_def_ID = int(input("    Test Definition ID: "))
         except ValueError:
-            print("Invalid choice (must be an integer). Try again.")
+            print("    Invalid choice (must be an integer). Try again.")
+            continue
+        if user_test_def_ID <1:
+            print("    Invalid choice (must be a positive integer). Try again.")
             continue
 
         test_defs = read_list_bin(FILE_TEST_DEFINITIONS)
         if (test_defs == None) or (test_defs==[]):
             print("Problem with test definition file: empty")
-            sys.exit()
+            sys.exit()  # stop entire program, because test definition file MUST be correct
 
         if index_already_there(user_test_def_ID, test_defs):
             return user_test_def_ID
         else:
-            print("Invalid choice (Test Definition ID ",user_test_def_ID," does not exist). Try again.")
+            print("Invalid choice (Test Definition ID",user_test_def_ID,"does not exist). Try again.")
             continue
 
 
@@ -107,27 +113,72 @@ def get_test_def_ID():
 ######################################################################
 def main():
 
-    # TODO: run initializations to refresh data and make sure files are here
+    print("\nProject:\t", PROJECT_NAME)
+    print("Use Case:\t",USE_CASE_NAME)
 
+
+    # Run initializations, to refresh data and make sure files are here. Also, this loads the lists in memory.
+    # For now, initialization functions are self-contained and hard-coded:
+    # all definition data is initialized from the code, not from user interaction.
+    AutoResilGlobal.test_case_list =                init_test_cases()
+    AutoResilGlobal.test_definition_list =          init_test_definitions()
+    AutoResilGlobal.recipient_list =                init_recipients()
+    AutoResilGlobal.challenge_definition_list =     init_challenge_definitions()
+    AutoResilGlobal.metric_definition_list =        init_metric_definitions()
+
+    AutoResilGlobal.physical_resource_list =        init_physical_resources()
+    AutoResilGlobal.cloud_virtual_resource_list =   init_cloud_virtual_resources()
+    AutoResilGlobal.VNF_Service_list =              init_VNFs_Services()
+
+
+    # start with no test definition selected
     selected_test_def_ID = -1
 
+    # interactive menu loop
     while True:
 
         show_menu(selected_test_def_ID)
         user_choice = get_menu_choice()
-        #print("user_choice:",user_choice) #test
+        #print("***user_choice:",user_choice) #debug
 
-        if user_choice == 1:
+        if user_choice == 1:  # select Test Definition ID
             selected_test_def_ID = get_test_def_ID()
+            selected_test_def = get_indexed_item_from_list(selected_test_def_ID, AutoResilGlobal.test_definition_list)
+            continue
 
-        if user_choice == 4:
+        if user_choice == 2:  # view currently selected Test Definition details
+            if selected_test_def_ID > 0:
+                if selected_test_def == None:
+                    print("Problem with test definition: empty")
+                    sys.exit()  # stop entire program, because test definition MUST be correct
+                else:
+                    selected_test_def.printout_all(0)
+                    continue
+            else:
+                print("No current selection of Test Definition. Try again.")
+                continue
+
+        if user_choice == 3:  # start an execution of currently selected Test Definition
+            if selected_test_def_ID > 0:
+                if selected_test_def == None:
+                    print("Problem with test definition: empty")
+                    sys.exit()  # stop entire program, because test definition MUST be correct
+                else:
+                    # TODO run test: method of TestDefinition, or function ?
+                    pass
+            else:
+                print("No current selection of Test Definition. Try again.")
+                continue
+
+        if user_choice == 4:  # exit
+            print("\nEnd of Main Program")
+            print("\nProject:\t", PROJECT_NAME)
+            print("Use Case:\t",USE_CASE_NAME)
+            print("\nBye!\n")
             sys.exit()
 
-    print(get_indexed_item_from_file(selected_test_def_ID,FILE_TEST_DEFINTIONS))
 
-    print(get_indexed_item_from_file(5,FILE_TEST_CASES))
 
-    print("End of Main\n  Project: \t\t", PROJECT_NAME, "\n  Use Case:\t",USE_CASE_NAME)
 
 if __name__ == "__main__":
     main()
index cc3d0ef..757d1e5 100644 (file)
@@ -53,6 +53,7 @@ import csv
 import sys
 from enum import Enum
 from datetime import datetime, timedelta
+import AutoResilGlobal
 
 # Constants with definition file names
 FILE_PHYSICAL_RESOURCES =       "ResourcesPhysical.bin"
@@ -64,6 +65,9 @@ FILE_METRIC_DEFINITIONS =       "DefinitionsMetrics.bin"
 FILE_CHALLENGE_DEFINITIONS =    "DefinitionsChallenges.bin"
 FILE_TEST_DEFINITIONS =         "DefinitionsTests.bin"
 
+# Other constants
+INDENTATION_MULTIPLIER =        4
+
 
 ######################################################################
 
@@ -165,6 +169,15 @@ class TestCase(AutoBaseObject):
         # Auto JIRA link
         self.JIRA_URL = test_case_JIRA_URL
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Test Case ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-JIRA URL:", self.JIRA_URL, sep='')
+
 
 # no need for functions to remove data: ever-growing library, arbitrary ID
 # initial version: should not even add data dynamically, in case object signature changes
@@ -279,6 +292,57 @@ class TestDefinition(AutoBaseObject):
         self.test_API_command_sent_list = test_def_testAPICommandSent
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "\nTest Definition ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-associated test case ID:", self.test_case_ID, sep='')
+        test_case = get_indexed_item_from_list(self.test_case_ID, AutoResilGlobal.test_case_list)
+        if test_case != None:
+            test_case.printout_all(indent_level+1)
+
+        print(indent, "|-associated challenge def ID:", self.challenge_def_ID, sep='')
+        challenge_def = get_indexed_item_from_list(self.challenge_def_ID, AutoResilGlobal.challenge_definition_list)
+        if challenge_def != None:
+            challenge_def.printout_all(indent_level+1)
+
+        if self.VNF_ID_list != None:
+            if len(self.VNF_ID_list) >0:
+                print(indent, "|-associated VNFs:", sep='')
+                for VNF_ID in self.VNF_ID_list:
+                    VNF_item = get_indexed_item_from_list(VNF_ID, AutoResilGlobal.VNF_Service_list)
+                    if VNF_item != None:
+                        VNF_item.printout_all(indent_level+1)
+
+        if self.associated_metrics_ID_list != None:
+            if len(self.associated_metrics_ID_list) >0:
+                print(indent, "|-associated metrics:", sep='')
+                for Metric_ID in self.associated_metrics_ID_list:
+                    Metric_item = get_indexed_item_from_list(Metric_ID, AutoResilGlobal.metric_definition_list)
+                    if Metric_item != None:
+                        Metric_item.printout_all(indent_level+1)
+
+        if self.recipient_ID_list != None:
+            if len(self.recipient_ID_list) >0:
+                print(indent, "|-associated recipients:", sep='')
+                for recipient_ID in self.recipient_ID_list:
+                    recipient_item = get_indexed_item_from_list(recipient_ID, AutoResilGlobal.recipient_list)
+                    if recipient_item != None:
+                        recipient_item.printout_all(indent_level+1)
+
+        if self.test_CLI_command_sent_list != None:
+            if len(self.test_CLI_command_sent_list) >0:
+                print(indent, "|-associated CLI commands:", sep='')
+                for CLI_command in self.test_CLI_command_sent_list:
+                    print(" "*INDENTATION_MULTIPLIER, "|- ", CLI_command, sep='')
+
+        # TODO: self.test_API_command_sent_list (depends how API commands are stored: likely a list of strings)
+
+
+
 def init_test_definitions():
     """Function to initialize test definition data."""
     test_definitions = []
@@ -289,9 +353,9 @@ def init_test_definitions():
     test_def_challengeDefID = 1
     test_def_testCaseID = 5
     test_def_VNFIDs = [1]
-    test_def_associatedMetricsIDs = []
+    test_def_associatedMetricsIDs = [2]
     test_def_recipientIDs = [2]
-    test_def_testCLICommandSent = ["pwd"]
+    test_def_testCLICommandSent = ["pwd","kubectl describe pods --include-uninitialized=false"]
     test_def_testAPICommandSent = ["data1","data2"]
     test_definitions.append(TestDefinition(test_def_ID, test_def_name,
                                            test_def_challengeDefID,
@@ -329,8 +393,10 @@ class ChallengeDefinition(AutoBaseObject):
     def __init__ (self, chall_def_ID, chall_def_name,
                   chall_def_challengeType,
                   chall_def_recipientID,
-                  chall_def_impactedResourcesInfo,
-                  chall_def_impactedResourceIDs,
+                  chall_def_impactedCloudResourcesInfo,
+                  chall_def_impactedCloudResourceIDs,
+                  chall_def_impactedPhysResourcesInfo,
+                  chall_def_impactedPhysResourceIDs,
                   chall_def_startChallengeCLICommandSent,
                   chall_def_stopChallengeCLICommandSent,
                   chall_def_startChallengeAPICommandSent,
@@ -345,10 +411,17 @@ class ChallengeDefinition(AutoBaseObject):
         self.challenge_type = chall_def_challengeType
         # recipient instance, to start/stop the challenge
         self.recipient_ID = chall_def_recipientID
-        # free-form info about impacted resource(s)
-        self.impacted_resources_info = chall_def_impactedResourcesInfo
+
+        # free-form info about cloud virtual impacted resource(s)
+        self.impacted_cloud_resources_info = chall_def_impactedCloudResourcesInfo
+        # impacted resources (list of IDs, usually only 1)
+        self.impacted_cloud_resource_ID_list = chall_def_impactedCloudResourceIDs
+
+        # free-form info about physical impacted resource(s)
+        self.impacted_phys_resources_info = chall_def_impactedPhysResourcesInfo
         # impacted resources (list of IDs, usually only 1)
-        self.impacted_resource_ID_list = chall_def_impactedResourceIDs
+        self.impacted_phys_resource_ID_list = chall_def_impactedPhysResourceIDs
+
         # if CLI; can include hard-coded references to resources
         self.start_challenge_CLI_command_sent = chall_def_startChallengeCLICommandSent
         # if CLI; to restore to normal
@@ -359,6 +432,50 @@ class ChallengeDefinition(AutoBaseObject):
         self.stop_challenge_API_command_sent = chall_def_stopChallengeAPICommandSent
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Challenge Definition ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-challenge type:", self.challenge_type, sep='')
+
+        print(indent, "|-associated recipient ID:", self.recipient_ID, sep='')
+        recipient = get_indexed_item_from_list(self.recipient_ID, AutoResilGlobal.recipient_list)
+        if recipient != None:
+            recipient.printout_all(indent_level+1)
+
+        print(indent, "|-info about cloud virtual impacted resource(s):", self.impacted_cloud_resources_info, sep='')
+
+        if self.impacted_cloud_resource_ID_list != None:
+            if len(self.impacted_cloud_resource_ID_list) >0:
+                print(indent, "|-associated cloud virtual impacted resource(s):", sep='')
+                for cloud_resource_ID in self.impacted_cloud_resource_ID_list:
+                    cloud_resource_item = get_indexed_item_from_list(cloud_resource_ID, AutoResilGlobal.cloud_virtual_resource_list)
+                    if cloud_resource_item != None:
+                        cloud_resource_item.printout_all(indent_level+1)
+
+        print(indent, "|-info about physical virtual impacted resource(s):", self.impacted_phys_resources_info, sep='')
+
+        if self.impacted_phys_resource_ID_list != None:
+            if len(self.impacted_phys_resource_ID_list) >0:
+                print(indent, "|-associated physical impacted resource(s):", sep='')
+                for phys_resource_ID in self.impacted_phys_resource_ID_list:
+                    phys_resource_item = get_indexed_item_from_list(phys_resource_ID, AutoResilGlobal.physical_resource_list)
+                    if phys_resource_item != None:
+                        phys_resource_item.printout_all(indent_level+1)
+
+        print(indent, "|-CLI command to start challenge:", self.start_challenge_CLI_command_sent, sep='')
+
+        print(indent, "|-CLI command to stop challenge:", self.stop_challenge_CLI_command_sent, sep='')
+
+        # TODO: self.start_challenge_API_command_sent (depends how API commands are stored: likely a list of strings)
+        # TODO: self.stop_challenge_API_command_sent (depends how API commands are stored: likely a list of strings)
+
+
+
+
 def init_challenge_definitions():
     """Function to initialize challenge definition data."""
     challenge_defs = []
@@ -368,18 +485,26 @@ def init_challenge_definitions():
     chall_def_name = "VM failure"
     chall_def_challengeType = ChallengeType.COMPUTE_HOST_FAILURE
     chall_def_recipientID = 1
-    chall_def_impactedResourcesInfo = "OpenStack VM on ctl02 in Arm pod"
-    chall_def_impactedResourceIDs = [2]
+    chall_def_impactedCloudResourcesInfo = "OpenStack VM on ctl02 in Arm pod"
+    chall_def_impactedCloudResourceIDs = [2]
+    chall_def_impactedPhysResourcesInfo = "physical server XYZ"
+    chall_def_impactedPhysResourceIDs = [1]
     chall_def_startChallengeCLICommandSent = "service nova-compute stop"
     chall_def_stopChallengeCLICommandSent = "service nova-compute restart"
+       # OpenStack VM Suspend vs. Pause: suspend stores the state of VM on disk while pause stores it in memory (RAM)
+       # $ nova suspend NAME
+       # $ nova resume NAME
+
     chall_def_startChallengeAPICommandSent = []
     chall_def_stopChallengeAPICommandSent = []
 
     challenge_defs.append(ChallengeDefinition(chall_def_ID, chall_def_name,
                                               chall_def_challengeType,
                                               chall_def_recipientID,
-                                              chall_def_impactedResourcesInfo,
-                                              chall_def_impactedResourceIDs,
+                                              chall_def_impactedCloudResourcesInfo,
+                                              chall_def_impactedCloudResourceIDs,
+                                              chall_def_impactedPhysResourcesInfo,
+                                              chall_def_impactedPhysResourceIDs,
                                               chall_def_startChallengeCLICommandSent,
                                               chall_def_stopChallengeCLICommandSent,
                                               chall_def_startChallengeAPICommandSent,
@@ -422,12 +547,29 @@ class Recipient(AutoBaseObject):
         self.username_creds = recipient_userNameCreds
         # optional: password for user/pwd credentials
         self.password_creds = recipient_passwordCreds
-        # optional: password for user/pwd credentials
+        # optional: key credentials
         self.key_creds = recipient_keyCreds
         # optional: info about recipient's network (VPN, VCN, VN, Neutron, ...)
         self.network_info = recipient_networkInfo
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Recipient ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-version info:", self.version_info, sep='')
+        print(indent, "|-IP address:", self.access_IP_address, sep='')
+        print(indent, "|-URL:", self.access_URL, sep='')
+        print(indent, "|-username for user/pwd credentials:", self.username_creds, sep='')
+        print(indent, "|-password for user/pwd credentials:", self.password_creds, sep='')
+        print(indent, "|-key credentials:", self.key_creds, sep='')
+        print(indent, "|-info about network:", self.network_info, sep='')
+
+
+
 def init_recipients():
     """Function to initialize recipient data."""
     test_recipients = []
@@ -442,7 +584,29 @@ def init_recipients():
     recipient_userNameCreds = "ali"
     recipient_passwordCreds = "baba"
     recipient_keyCreds = "ssh-rsa k7fjsnEFzESfg6phg"
-    recipient_networkInfo = "UNH IOL 172.16.0.0/16"
+    recipient_networkInfo = "UNH IOL 172.16.0.0/22"
+
+    test_recipients.append(Recipient(recipient_ID, recipient_name,
+                                     recipient_info,
+                                     recipient_versionInfo,
+                                     recipient_accessIPAddress,
+                                     recipient_accessURL,
+                                     recipient_userNameCreds,
+                                     recipient_passwordCreds,
+                                     recipient_keyCreds,
+                                     recipient_networkInfo))
+
+    recipient_ID = 2
+    recipient_name = "Kubernetes on x86 pod"
+    recipient_info = "bare metal"
+    recipient_versionInfo = "v1.9"
+    recipient_accessIPAddress = "8.9.7.6"
+    recipient_accessURL = ""
+    recipient_userNameCreds = "kuber"
+    recipient_passwordCreds = "netes"
+    recipient_keyCreds = "ssh-rsa 0fjs7hjghsa37fhfs"
+    recipient_networkInfo = "UNH IOL 10.10.30.157/22"
+
 
     test_recipients.append(Recipient(recipient_ID, recipient_name,
                                      recipient_info,
@@ -476,6 +640,16 @@ class MetricDefinition(AutoBaseObject):
         self.info = metric_def_info
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Metric Definition ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-info:", self.info, sep='')
+
+
 class MetricValue:
     """Object for storing a measurement of a Metric Definition for Auto project, with common attributes
     (value, timestamp, metric_def_ID).
@@ -614,6 +788,19 @@ class PhysicalResource(AutoBaseObject):
         self.MAC_address = phys_resrc_MACAddress
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Physical Resource ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-info:", self.info, sep='')
+        print(indent, "|-IP address:", self.IP_address, sep='')
+        print(indent, "|-MAC address:", self.MAC_address, sep='')
+
+
+
 def init_physical_resources():
     """Function to initialize physical resource data."""
     test_physical_resources = []
@@ -623,13 +810,36 @@ def init_physical_resources():
     phys_resrc_name = "small-cavium-1"
     phys_resrc_info = "Jump server in Arm pod, 48 cores, 64G RAM, 447G SSD, aarch64 Cavium ThunderX, Ubuntu OS"
     phys_resrc_IPAddress = "10.10.50.12"
-    phys_resrc_MACAddress = ""
+    phys_resrc_MACAddress = "00-14-22-01-23-45"
 
     test_physical_resources.append(PhysicalResource(phys_resrc_ID, phys_resrc_name,
                                                     phys_resrc_info,
                                                     phys_resrc_IPAddress,
                                                     phys_resrc_MACAddress))
 
+    phys_resrc_ID = 2
+    phys_resrc_name = "medium-cavium-1"
+    phys_resrc_info = "Jump server in New York pod, 96 cores, 64G RAM, 447G SSD, aarch64 Cavium ThunderX, Ubuntu OS"
+    phys_resrc_IPAddress = "30.31.32.33"
+    phys_resrc_MACAddress = "0xb3:22:05:c1:aa:82"
+
+    test_physical_resources.append(PhysicalResource(phys_resrc_ID, phys_resrc_name,
+                                                    phys_resrc_info,
+                                                    phys_resrc_IPAddress,
+                                                    phys_resrc_MACAddress))
+
+    phys_resrc_ID = 3
+    phys_resrc_name = "mega-cavium-666"
+    phys_resrc_info = "Jump server in Las Vegas, 1024 cores, 1024G RAM, 6666G SSD, aarch64 Cavium ThunderX, Ubuntu OS"
+    phys_resrc_IPAddress = "54.53.52.51"
+    phys_resrc_MACAddress = "01-23-45-67-89-ab"
+
+    test_physical_resources.append(PhysicalResource(phys_resrc_ID, phys_resrc_name,
+                                                    phys_resrc_info,
+                                                    phys_resrc_IPAddress,
+                                                    phys_resrc_MACAddress))
+
+
     # write list to binary file
     write_list_bin(test_physical_resources, FILE_PHYSICAL_RESOURCES)
 
@@ -660,6 +870,25 @@ class CloudVirtualResource(AutoBaseObject):
         # optional: related/associated physical resources (if known and useful or interesting, list of integer IDs)
         self.related_phys_rsrc_ID_list = cldvirtres_related_phys_rsrcIDs
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "Cloud Virtual Resource ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-info:", self.info, sep='')
+        print(indent, "|-IP address:", self.IP_address, sep='')
+        print(indent, "|-URL:", self.URL, sep='')
+
+        if self.related_phys_rsrc_ID_list != None:
+            if len(self.related_phys_rsrc_ID_list) >0:
+                print(indent, "|-related/associated physical resource(s):", sep='')
+                for phys_resource_ID in self.related_phys_rsrc_ID_list:
+                    phys_resource_item = get_indexed_item_from_list(phys_resource_ID, AutoResilGlobal.physical_resource_list)
+                    if phys_resource_item != None:
+                        phys_resource_item.printout_all(indent_level+1)
+
 
 def init_cloud_virtual_resources():
     """Function to initialize cloud virtual resource data."""
@@ -679,6 +908,33 @@ def init_cloud_virtual_resources():
                                                        cldvirtres_URL,
                                                        cldvirtres_related_phys_rsrcIDs))
 
+    cldvirtres_ID = 2
+    cldvirtres_name = "nova-compute-2"
+    cldvirtres_info = "nova VM in LaaS"
+    cldvirtres_IPAddress = "50.60.70.80"
+    cldvirtres_URL = "http://50.60.70.80:8080"
+    cldvirtres_related_phys_rsrcIDs = [2,3]
+
+    test_cldvirt_resources.append(CloudVirtualResource(cldvirtres_ID, cldvirtres_name,
+                                                       cldvirtres_info,
+                                                       cldvirtres_IPAddress,
+                                                       cldvirtres_URL,
+                                                       cldvirtres_related_phys_rsrcIDs))
+
+    cldvirtres_ID = 3
+    cldvirtres_name = "nova-compute-3"
+    cldvirtres_info = "nova VM in x86 pod"
+    cldvirtres_IPAddress = "50.60.70.80"
+    cldvirtres_URL = "http://50.60.70.80:8080"
+    cldvirtres_related_phys_rsrcIDs = [1]
+
+    test_cldvirt_resources.append(CloudVirtualResource(cldvirtres_ID, cldvirtres_name,
+                                                       cldvirtres_info,
+                                                       cldvirtres_IPAddress,
+                                                       cldvirtres_URL,
+                                                       cldvirtres_related_phys_rsrcIDs))
+
+
     # write list to binary file
     write_list_bin(test_cldvirt_resources, FILE_CLOUD_RESOURCES)
 
@@ -713,6 +969,35 @@ class VNFService(AutoBaseObject):
         self.related_cloud_virt_rsrc_ID_list = vnf_serv_related_cloudvirt_rsrcIDs
 
 
+    def printout_all(self, indent_level):
+        """Print out all attributes, with an indentation level."""
+        indent = " "*indent_level*INDENTATION_MULTIPLIER
+
+        print(indent, "VNF or e2e Service ID:", self.ID, sep='')
+        print(indent, "|-name:", self.name, sep='')
+
+        print(indent, "|-info:", self.info, sep='')
+        print(indent, "|-IP address:", self.IP_address, sep='')
+        print(indent, "|-URL:", self.URL, sep='')
+
+        if self.related_phys_rsrc_ID_list != None:
+            if len(self.related_phys_rsrc_ID_list) >0:
+                print(indent, "|-related/associated physical resource(s):", sep='')
+                for phys_resource_ID in self.related_phys_rsrc_ID_list:
+                    phys_resource_item = get_indexed_item_from_list(phys_resource_ID, AutoResilGlobal.physical_resource_list)
+                    if phys_resource_item != None:
+                        phys_resource_item.printout_all(indent_level+1)
+
+        if self.related_cloud_virt_rsrc_ID_list != None:
+            if len(self.related_cloud_virt_rsrc_ID_list) >0:
+                print(indent, "|-related/associated cloud virtual resource(s):", sep='')
+                for cloud_resource_ID in self.related_cloud_virt_rsrc_ID_list:
+                    cloud_resource_item = get_indexed_item_from_list(cloud_resource_ID, AutoResilGlobal.cloud_virtual_resource_list)
+                    if cloud_resource_item != None:
+                        cloud_resource_item.printout_all(indent_level+1)
+
+
+
 def init_VNFs_Services():
     """Function to initialize VNFs and e2e Services data."""
     test_VNFs_Services = []
@@ -723,8 +1008,24 @@ def init_VNFs_Services():
     vnf_serv_info = "virtual CPE in Arm pod"
     vnf_serv_IPAddress = "5.4.3.2"
     vnf_serv_URL = "http://5.4.3.2:8080"
-    vnf_serv_related_phys_rsrcIDs = [2,4,6]
-    vnf_serv_related_cloudvirt_rsrcIDs = [1,2]
+    vnf_serv_related_phys_rsrcIDs = [1,2]
+    vnf_serv_related_cloudvirt_rsrcIDs = [1]
+
+    test_VNFs_Services.append(VNFService(vnf_serv_ID, vnf_serv_name,
+                                         vnf_serv_info,
+                                         vnf_serv_IPAddress,
+                                         vnf_serv_URL,
+                                         vnf_serv_related_phys_rsrcIDs,
+                                         vnf_serv_related_cloudvirt_rsrcIDs))
+
+
+    vnf_serv_ID = 2
+    vnf_serv_name = "vFW-1"
+    vnf_serv_info = "virtual Firewall in x86 pod"
+    vnf_serv_IPAddress = "6.7.8.9"
+    vnf_serv_URL = "http://6.7.8.9:8080"
+    vnf_serv_related_phys_rsrcIDs = [3]
+    vnf_serv_related_cloudvirt_rsrcIDs = [2,3]
 
     test_VNFs_Services.append(VNFService(vnf_serv_ID, vnf_serv_name,
                                          vnf_serv_info,
@@ -1010,7 +1311,7 @@ class TestExecution(AutoBaseObject):
 
 ######################################################################
 def dump_all_binaries_to_CSV():
-    """Get all content from all binary files, and dump everything in a snapshot CSV file."""
+    """Get all content from all Definition data binary files, and dump everything in a snapshot CSV file."""
     ## TODO
     timenow = datetime.now()
 
@@ -1018,6 +1319,8 @@ def dump_all_binaries_to_CSV():
 ######################################################################
 def main():
 
+
+    # everything here is for unit-testing of this module; not part of actual code
     tcs = init_test_cases()
     print(tcs)
 
index 2ceba40..1364b4a 100644 (file)
@@ -47,6 +47,9 @@
 ##logs
 
 
+######################################################################
+# import statements
+import AutoResilGlobal
 
 def f1():
     return 0