aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDileep Ranganathan <dileep.ranganathan@intel.com>2018-10-06 16:35:11 -0700
committerDileep Ranganathan <dileep.ranganathan@intel.com>2018-10-08 18:13:45 +0000
commit5dc29aeb2500c1f0f344e8ab011925754a7c73a5 (patch)
tree1afac8f4a79ce625ab8a27c83a2c8ae5b0c4689b
parentce54a0434ded2f149266d9cdf082af4ae8665cec (diff)
OOF HAS CSIT with MUSIC v3 integration
Updated HAS setup and teardown scripts Added MUSIC v3 support, AAF support, Basic Authorization for MUSIC. Used AAF_RootCA for A&AI simulator. Sync conductor.conf based on generated latest conf. Change-Id: Id1a6c8a4e524a6ade5b60277a6cb538724902d11 Issue-ID: OPTFRA-366 Signed-off-by: Dileep Ranganathan <dileep.ranganathan@intel.com>
-rw-r--r--scripts/optf-has/has/has-properties/AAF_RootCA.cer31
-rw-r--r--scripts/optf-has/has/has-properties/cert.cer36
-rw-r--r--scripts/optf-has/has/has-properties/cert.key28
-rw-r--r--scripts/optf-has/has/has-properties/cert.pem36
-rw-r--r--scripts/optf-has/has/has-properties/conductor.conf.onap340
-rwxr-xr-xscripts/optf-has/has/has_script.sh30
-rwxr-xr-xscripts/optf-has/has/music_script.sh100
-rwxr-xr-xscripts/optf-has/has/music_teardown_script.sh38
-rwxr-xr-xscripts/optf-has/has/simulator_script.sh25
-rwxr-xr-xscripts/optf-has/has/simulator_teardown_script.sh2
-rw-r--r--tests/optf-has/has/optf_has_test.robot61
11 files changed, 499 insertions, 228 deletions
diff --git a/scripts/optf-has/has/has-properties/AAF_RootCA.cer b/scripts/optf-has/has/has-properties/AAF_RootCA.cer
new file mode 100644
index 00000000..e9a50d7e
--- /dev/null
+++ b/scripts/optf-has/has/has-properties/AAF_RootCA.cer
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFPjCCAyagAwIBAgIJAJ6u7cCnzrWdMA0GCSqGSIb3DQEBCwUAMCwxDjAMBgNV
+BAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzAeFw0xODA0MDUx
+NDE1MjhaFw0zODAzMzExNDE1MjhaMCwxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQK
+DARPTkFQMQswCQYDVQQGEwJVUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAMA5pkgRs7NhGG4ew5JouhyYakgYUyFaG121+/h8qbSdt0hVQv56+EA41Yq7
+XGie7RYDQK9NmAFF3gruE+6X7wvJiChp+Cyd7sFMnb65uWhxEdxWTM2BJFrgfzUn
+H8ZCxgaCo3XH4PzlKRy2LQQJEJECwl/RZmRCXijMt5e9h8XoZY/fKkKcZZUsWNCM
+pTo266wjvA9MXLmdgReRj0+vrCjrNqy+htwJDztoiHWiYPqT6o8EvGcgjNqjlZx7
+NUNf8MfLDByqKF6+wRbHv1GKjn3/Vijd45Fv8riyRYROiFanvbV6jIfBkv8PZbXg
+2VDWsYsgp8NAvMxK+iV8cO+Ck3lBI2GOPZbCEqpPVTYbLUz6sczAlCXwQoPzDIZY
+wYa3eR/gYLY1gP2iEVHORag3bLPap9ZX5E8DZkzTNTjovvLk8KaCmfcaUMJsBtDd
+ApcUitz10cnRyZc1sX3gE1f3DpzQM6t9C5sOVyRhDcSrKqqwb9m0Ss04XAS9FsqM
+P3UWYQyqDXSxlUAYaX892u8mV1hxnt2gjb22RloXMM6TovM3sSrJS0wH+l1nznd6
+aFXftS/G4ZVIVZ/LfT1is4StoyPWZCwwwly1z8qJQ/zhip5NgZTxQw4mi7ww35DY
+PdAQOCoajfSvFjqslQ/cPRi/MRCu079heVb5fQnnzVtnpFQRAgMBAAGjYzBhMB0G
+A1UdDgQWBBRTVTPyS+vQUbHBeJrBKDF77+rtSTAfBgNVHSMEGDAWgBRTVTPyS+vQ
+UbHBeJrBKDF77+rtSTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAN
+BgkqhkiG9w0BAQsFAAOCAgEAPx/IaK94n02wPxpnYTy+LVLIxwdq/kawNd6IbiMz
+L87zmNMDmHcGbfoRCj8OkhuggX9Lx1/CkhpXimuYsZOFQi5blr/u+v4mIbsgbmi9
+7j+cUHDP0zLycvSvxKHty51LwmaX9a4wkJl5zBU4O1sd/H9tWcEmwJ39ltKoBKBx
+c94Zc3iMm5ytRWGj+0rKzLDAXEWpoZ5bE5PLJauA6UDCxDLfs3FwhbS7uDggxYvf
+jySF5FCNET94oJ+m8s7VeHvoa8iPGKvXrIqdd7XDHnqJJlVKr7m9S0fMbyEB8ci2
+RtOXDt93ifY1uhoEtEykn4dqBSp8ezvNMnwoXdYPDvTd9uCAFeWFLVreBAWxd25h
+PsBTkZA5hpa/rA+mKv6Af4VBViYr8cz4dZCsFChuioVebe9ighrfjB//qKepFjPF
+CyjzKN1u0JKm/2x/ORqxkTONG8p3uDwoIOyimUcTtTMv42bfYD88RKakqSFXE9G+
+Z0LlaKABqfjK49o/tsAp+c5LoNlYllKhnetO3QAdraHwdmC36BhoghzR1jpX751A
+cZn2VH3Q4XKyp01cJNCJIrua+A+bx6zh3RyW6zIIkbRCbET+UD+4mr8WIcSE3mtR
+ZVlnhUDO4z9//WKMVzwS9Rh8/kuszrGFI1KQozXCHLrce3YP6RYZfOed79LXaRwX
+dYY=
+-----END CERTIFICATE-----
diff --git a/scripts/optf-has/has/has-properties/cert.cer b/scripts/optf-has/has/has-properties/cert.cer
deleted file mode 100644
index 67bb1303..00000000
--- a/scripts/optf-has/has/has-properties/cert.cer
+++ /dev/null
@@ -1,36 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIGFjCCBP6gAwIBAgIQaTKJblnN1egdvyJmqxK6TDANBgkqhkiG9w0BAQsFADB+
-MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd
-BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVj
-IENsYXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MB4XDTE3MDgzMTAwMDAwMFoX
-DTE4MDgzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhNaWNoaWdh
-bjETMBEGA1UEBwwKU291dGhmaWVsZDEcMBoGA1UECgwTQVQmVCBTZXJ2aWNlcywg
-SW5jLjESMBAGA1UECwwJQ29uZHVjdG9yMSYwJAYDVQQDDB1lY29tcC1wZXctOTct
-MDE3LnBlZGMuc2JjLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANiCKEitPcCKcmTTmvuwItG34wVOhhWuha1GQ9KeW/JmKgDWYM/7BwKmT6FhrSWe
-998UKHKC+MriZKI6WsBoENu070zTyyphQ0SwTw7QZbeCpgrvSBv6+q9qWpkGZEQN
-OgZ4IOVQX1asqh+qmUuVKWIAN1AF60iMb+Krqr04FX/N+3N9wLFfOJIS80Ycrxwa
-2Kjqza9awVXOtuTHPa4hFqz7ggRoi7Ybdr8GyxNoXTP0QNCBsYYmjuTFnbfCnC/j
-d/1zMn3D6G4eihnTnUB9jhM+Jj85IXcgAG5um/jEjN7qxmi+kURFl6AbadmgTCca
-aIW1rOHZtR4vlA/sRWqSh28CAwEAAaOCAnwwggJ4MCgGA1UdEQQhMB+CHWVjb21w
-LXBldy05Ny0wMTcucGVkYy5zYmMuY29tMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQD
-AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBhBgNVHSAEWjBYMFYG
-BmeBDAECAjBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAl
-BggrBgEFBQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAfBgNVHSMEGDAW
-gBRfYM9hkFXfhEMUimAqsvV69EMY7zArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8v
-c3Muc3ltY2IuY29tL3NzLmNybDBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGG
-E2h0dHA6Ly9zcy5zeW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zcy5zeW1j
-Yi5jb20vc3MuY3J0MIIBBgYKKwYBBAHWeQIEAgSB9wSB9ADyAHcA3esdK3oNT6Yg
-i4GtgWhwfi6OnQHVXIiNPRHEzbbsvswAAAFeOADGyAAABAMASDBGAiEAzYxTfoKt
-RnxlePKnJ0sCqLOvdd223T7CjqNsqbgmxfECIQC6FOBOe9J+a1poasZ7QfCVl9g2
-McAdcKofxp21Qw1DhwB3AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQ
-AAABXjgAxuAAAAQDAEgwRgIhAIUbjCQBxcxAXBT3MS77jIR3Lw90Y622+JGAuhH7
-PASuAiEAzblNSNu2GDHu/KINsiX4apBzXgSw5J8BM9LCAYPmUogwDQYJKoZIhvcN
-AQELBQADggEBAIwOqd+U0iRFSt68vWh1ErMeY0I7Re/81cm17cAn1cQuhTNKFUwq
-lYnVXZHFBkGhVAU0vXAI59XN29TQ3sjBlmfDdtxAJ3PzITBxeHswJjnqCaslEGik
-sbdK4/cwCjWmAN0azKtUmKhH3ajnjyduWdlvCx5hsUdFmYGZ1yl+1QbTrwkkU9JB
-bYjHNbtca0Orq8JlfZlc6L9vO6LNU6+qa9NTkLs2qd3rsCOXUiAWhGBdARB+a0AT
-1ukrZDS2BZ6fUDmG2XxUsRPqUwuVNAb8NgOc0zLNaAe8CpU6fVzek1fZnL0KkJmK
-jJnnuCr6AOteod19VIChd54mo0QtFm+i/Ww=
------END CERTIFICATE-----
-
diff --git a/scripts/optf-has/has/has-properties/cert.key b/scripts/optf-has/has/has-properties/cert.key
deleted file mode 100644
index b8a957ff..00000000
--- a/scripts/optf-has/has/has-properties/cert.key
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEA2IIoSK09wIpyZNOa+7Ai0bfjBU6GFa6FrUZD0p5b8mYqANZg
-z/sHAqZPoWGtJZ733xQocoL4yuJkojpawGgQ27TvTNPLKmFDRLBPDtBlt4KmCu9I
-G/r6r2pamQZkRA06Bngg5VBfVqyqH6qZS5UpYgA3UAXrSIxv4quqvTgVf837c33A
-sV84khLzRhyvHBrYqOrNr1rBVc625Mc9riEWrPuCBGiLtht2vwbLE2hdM/RA0IGx
-hiaO5MWdt8KcL+N3/XMyfcPobh6KGdOdQH2OEz4mPzkhdyAAbm6b+MSM3urGaL6R
-REWXoBtp2aBMJxpohbWs4dm1Hi+UD+xFapKHbwIDAQABAoIBAQCQVn1arjwL34CR
-3UxmXK9p1si/YfEcBURTFxPiFva/bAK2mjTikrzCtHND6GVRPmCLVNn+NXh9cV6b
-lIGp4fbTMhWSx2ObdkotQckC3EXjiHL/uTP+i1ySkzmg6NTxVUwIwg9UMTfOBcBI
-6ifWbrOvBOvbKocHz7BLkhx6lygmEccyiy3wD/a/NBTRFTBLFyGrNBh2/a9ZXRqs
-Gz1IxVSdxrNJZUoi1nKbBTOX5lKyjL0AyAkIEzC4MvgEBcGz5xZHFRF1cj4x0ajc
-xEDsRUv0hi3Vczw5/FfKVWUVQPmY7sqpLtvu9qnb9MeZFwtrVZBxG5Ik4LP0Sjxt
-0B1+EHYpAoGBAPeOpR1co9pJa8tgkObZWehrVd+VEMD9UM5SKfYYn/2FyVMl1/TH
-Z6SqB7e1aNYsT5oUDt5y3g+tG3i/r4zmE4OzwT/9neb/rVBsKdd5cPICVnhHajYu
-bdOKoCNEMBrQRBSBAeSK0IjbUYIMyre1bwhxU7HT5NzGJnLYBn4vx0BNAoGBAN/k
-bxLQpsYcMwAX4K0H42qI1yL4jlezv4zj+kDRAI9Szh94c2yxGBC4rAub3Igz1OlQ
-CfqPimvlnkWrhgz50+0CdJFPEQyC0+d2rzS7i816k8WYUYCDkrTJhr64eFnV1jjs
-AuLpnhF0WpqvrixBzf5ZENPV3C8k4HG4KrYjDuSrAoGBALeDELdRY01/u97JuODI
-IrP+TWwujnrhzbMEiYKbAo7nTDTNCuezogsY2BvA6PRLaL7pO5R/RkoMox7ByhsC
-u1iYOht7oEALLKk/ZU0MA0QDo6IKHpwHkvaL/uXluFtIJA+nCoYmuSuamTN01BmW
-77YsfESItVFLuljL9xQ3ytbJAoGAVqkd0SOQGgiaOQQFBBSUkwzqcO/ScOHzV756
-hBIh7Ff5zraZvs2Bah+BAHFQ2Ctv0usXIbPjuUXEkGUG2wjsXcXghsoa6EPPb71B
-reCWCW/TuNzvVxYWeAG1NSdD9knNxHSd3WTduRXXaB5uBVVnPXcOC2Cw/FKCyaGm
-bp99SUcCgYEAxzGq0cxFedF7TAQLjIMagsGIAatokzDvvQOvOK0lWZ+f17G+LV9Y
-tLpnvS6IdGnki6Kvg9Xa0F4eP7YoY4laHxl2DEceP/TeMLNHetM9cXCPKwP7w/24
-5mZlQ0t/HdVnjc1uDvkeHR6HVxnXTyWtKBJ0FtC6SfdRgK20YYFrKAQ=
------END RSA PRIVATE KEY-----
-
diff --git a/scripts/optf-has/has/has-properties/cert.pem b/scripts/optf-has/has/has-properties/cert.pem
deleted file mode 100644
index 5ecf3823..00000000
--- a/scripts/optf-has/has/has-properties/cert.pem
+++ /dev/null
@@ -1,36 +0,0 @@
-Bag Attributes
- friendlyName: mso-client
- localKeyID: 54 69 6D 65 20 31 35 31 39 32 39 37 30 37 31 32 33 33
-subject=/C=US/ST=Michigan/L=Southfield/O=AT&T Services, Inc./OU=mso-bpel-client-mtanj/CN=msobpel-client.mtanj.aic.cip.att.com
-issuer=/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
------BEGIN CERTIFICATE-----
-MIIFZDCCBEygAwIBAgIQCDZ0gBbsclD2Ino3w+NqPDANBgkqhkiG9w0BAQsFADBN
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
-aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTgwMTE5MDAwMDAwWhcN
-MTkwMTE5MTIwMDAwWjCBojELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1pY2hpZ2Fu
-MRMwEQYDVQQHEwpTb3V0aGZpZWxkMRwwGgYDVQQKDBNBVCZUIFNlcnZpY2VzLCBJ
-bmMuMR4wHAYDVQQLExVtc28tYnBlbC1jbGllbnQtbXRhbmoxLTArBgNVBAMTJG1z
-b2JwZWwtY2xpZW50Lm10YW5qLmFpYy5jaXAuYXR0LmNvbTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAOJtbcWtMUYCIgIvdqm2CPN/cVTD8j3fDAsd42vn
-7I3PYJ4aBu8tiJVRheJhj9mejfwjBd5f5E2z9kWfNMPZU/9q0RB+cYbKWv0lP+q5
-q/RkbXN7iRtGUkXUyNpekvxNT3IKYfXK3P29qVDVhvUSey2ngIALRvBrRIKRTmb8
-gzrvcavJSwm8oQw2JXE1+Da+8PYR3TjJ19nfmoTmKbO+QDD58I5+2TgNqd/b7zhN
-GLaS3oiVONDmJ1b5iWwKg31otPDP8AJb7cNtl8vgfnGK2zvFIWnF2TRzMb6FePbn
-JBLaEyi7+c1iKJafj61t5nn27I2psbJloT9/2fmb6l4NU8MCAwEAAaOCAegwggHk
-MB8GA1UdIwQYMBaAFA+AYRyCMWHVLyjnjUY4tCzhxtniMB0GA1UdDgQWBBSQcljn
-BCxIKpisBfyoNgGCdtPzBzAvBgNVHREEKDAmgiRtc29icGVsLWNsaWVudC5tdGFu
-ai5haWMuY2lwLmF0dC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
-AQUFBwMBBggrBgEFBQcDAjBrBgNVHR8EZDBiMC+gLaArhilodHRwOi8vY3JsMy5k
-aWdpY2VydC5jb20vc3NjYS1zaGEyLWc2LmNybDAvoC2gK4YpaHR0cDovL2NybDQu
-ZGlnaWNlcnQuY29tL3NzY2Etc2hhMi1nNi5jcmwwTAYDVR0gBEUwQzA3BglghkgB
-hv1sAQEwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
-UzAIBgZngQwBAgIwfAYIKwYBBQUHAQEEcDBuMCQGCCsGAQUFBzABhhhodHRwOi8v
-b2NzcC5kaWdpY2VydC5jb20wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jYWNlcnRzLmRp
-Z2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJTZWN1cmVTZXJ2ZXJDQS5jcnQwCQYDVR0T
-BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAxkadmzFcpA3f3qc9PbzMWfV2lJCXWxfr
-/6z4RXotl255GBZFR2zLn56k8J3hAJGWRc0WeSgSsLH1fxrxF60fWk+cmYCrMC9t
-C5ha5zWav/kz+dkZvJVbUxIFdx0Cd5uqBsLFnAaGrnSR6WzJkZHQ2rQUvwvQXwdP
-XL01FleDSNbV8jtHXvzmcdnVQWeLjcVOeOeBF3dW6lSvDRV0G6fe6+R9U+Gz0MwK
-x93XbsIAMTCJKUBkV7QdHwHzis3fhKJHwJUrb1p2Byhn/RwYUmFbjkamFiEfAyzw
-+KdkwripOgYHnmGyLBJ16FdO/8kGhn4URW/qL1FO/sN2loGGlyA82w==
------END CERTIFICATE-----
diff --git a/scripts/optf-has/has/has-properties/conductor.conf.onap b/scripts/optf-has/has/has-properties/conductor.conf.onap
index 2c5b8d6c..c000248c 100644
--- a/scripts/optf-has/has/has-properties/conductor.conf.onap
+++ b/scripts/optf-has/has/has-properties/conductor.conf.onap
@@ -1,4 +1,3 @@
-
[DEFAULT]
#
@@ -9,7 +8,14 @@
#api_paste_config = api_paste.ini
# Music keyspace for content (string value)
-keyspace = conductor
+#keyspace = conductor
+
+# Delay time (Seconds) for MUSIC requests. Set it to 2 seconds by default.
+# (integer value)
+#delay_time = 2
+
+# (boolean value)
+#HPA_enabled = true
#
# From oslo.log
@@ -20,12 +26,6 @@ keyspace = conductor
# Note: This option can be changed without restarting.
debug = true
-# DEPRECATED: If set to false, the logging level will be set to WARNING instead
-# of the default INFO level. (boolean value)
-# This option is deprecated for removal.
-# Its value may be silently ignored in the future.
-#verbose = true
-
# The name of a logging configuration file. This file is appended to any
# existing logging configuration files. For details about logging configuration
# files, see the Python logging module documentation. Note that when logging
@@ -39,7 +39,7 @@ log_config_append = /usr/local/bin/log.conf
# Defines the format string for %%(asctime)s in log records. Default:
# %(default)s . This option is ignored if log_config_append is set. (string
# value)
-log_date_format = %d-%m-%Y %H:%M:%S
+#log_date_format = %Y-%m-%d %H:%M:%S
# (Optional) Name of log file to send logging output to. If no default is set,
# logging will go to stderr as defined by use_stderr. This option is ignored if
@@ -47,15 +47,11 @@ log_date_format = %d-%m-%Y %H:%M:%S
# Deprecated group/name - [DEFAULT]/logfile
#log_file = application.log
-
# (Optional) The base directory used for relative log_file paths. This option
# is ignored if log_config_append is set. (string value)
# Deprecated group/name - [DEFAULT]/logdir
log_dir = /var/log
-
-
-
# Uses logging handler designed to watch file system. When log file is moved or
# removed this handler will open a new log file with specified path
# instantaneously. It makes sense only if log_file option is specified and
@@ -68,10 +64,20 @@ log_dir = /var/log
# is set. (boolean value)
#use_syslog = false
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
# Syslog facility to receive log lines. This option is ignored if
# log_config_append is set. (string value)
#syslog_log_facility = LOG_USER
+# Use JSON formatting for logging. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_json = false
+
# Log output to standard error. This option is ignored if log_config_append is
# set. (boolean value)
#use_stderr = false
@@ -96,7 +102,7 @@ log_dir = /var/log
# List of package logging levels in logger=LEVEL pairs. This option is ignored
# if log_config_append is set. (list value)
-#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,oslo_messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
# Enables or disables publication of error events. (boolean value)
#publish_errors = false
@@ -125,6 +131,53 @@ log_dir = /var/log
#fatal_deprecations = false
+[aaf_authentication]
+
+#
+# From conductor
+#
+
+# is_aaf_enabled. (boolean value)
+#is_aaf_enabled = true
+
+# aaf_cache_expiry_hrs. (integer value)
+#aaf_cache_expiry_hrs = 3
+
+# aaf_url. (string value)
+aaf_url = http://localhost:8100/authz/perms/user/
+
+# aaf_retries. (integer value)
+#aaf_retries = 3
+
+# aaf_timeout. (integer value)
+#aaf_timeout = 100
+
+# aaf_user_roles. (list value)
+#aaf_user_roles = {"type": "org.onap.oof","instance": "plans","action": "GET"},{"type": "org.onap.oof","instance": "plans","action": "POST"}
+
+
+[aaf_sms]
+
+#
+# From conductor
+#
+
+# Base URL for SMS, up to and not including the version, and without a trailing
+# slash. (string value)
+#aaf_sms_url = https://aaf-sms.onap:10443
+
+# Timeout for SMS API Call (integer value)
+#aaf_sms_timeout = 30
+
+# Path to the cacert that will be used to verify If this is None, verify will
+# be False and the server certis not verified by the client. (string value)
+#aaf_ca_certs = AAF_RootCA.cer
+
+# Domain UUID - A unique UUID generated when the domainfor HAS is created by
+# administrator during deployment (string value)
+#secret_domain = has
+
+
[aai]
#
@@ -132,29 +185,51 @@ log_dir = /var/log
#
# Interval with which to refresh the local cache, in minutes. (integer value)
+#cache_refresh_interval = 1440
cache_refresh_interval = 1
+
+# Interval with which to refresh the local complex cache, in minutes. (integer
+# value)
+#complex_cache_refresh_interval = 1440
complex_cache_refresh_interval = 60
# Data Store table prefix. (string value)
#table_prefix = aai
-# Base URL for A&AI, up to and including the version. (string value)
+# Base URL for A&AI, up to and not including the version, and without a
+# trailing slash. (string value)
+#server_url = https://controller:8443/aai
server_url = http://localhost:8081/aai/
+# Timeout for A&AI Rest Call (string value)
+#aai_rest_timeout = 30
-# The version of A&AI (string value)
-server_url_version = v13
+# Number of retry for A&AI Rest Call (string value)
+#aai_retries = 3
+
+# The version of A&AI in v# format. (string value)
+server_url_version = v14
# SSL/TLS certificate file in pem format. This certificate must be registered
# with the A&AI endpoint. (string value)
-certificate_file = /usr/local/bin/cert.cer
+#certificate_file = certificate.pem
+certificate_file =
# Private Certificate Key file in pem format. (string value)
-certificate_key_file = /usr/local/bin/cert.key
+#certificate_key_file = certificate_key.pem
+certificate_key_file =
# Certificate Authority Bundle file in pem format. Must contain the appropriate
-# trust chain for theCertificate file. (string value)
-certificate_authority_bundle_file = /usr/local/bin/cert.pem
+# trust chain for the Certificate file. (string value)
+#certificate_authority_bundle_file = certificate_authority_bundle.pem
+certificate_authority_bundle_file = /usr/local/bin/AAF_RootCA.cer
+
+# Username for AAI. (string value)
+username = OOF
+
+# Password for AAI. (string value)
+password = OOF
+
[api]
@@ -169,19 +244,28 @@ certificate_authority_bundle_file = /usr/local/bin/cert.pem
# Minimum value: 1
#default_api_return_limit = 100
+
[conductor_api]
-# Basic Authentication Username (string value)
+#
+# From conductor
+#
+
+# Base URL for plans. (string value)
+#server_url =
+
+# username for plans. (string value)
+#username =
username = admin1
-# Basic Authentication Password (string value)
+# password for plans. (string value)
+#password =
password = plan.15
-# To disable basic_auth_secure = false and to enable basic_auth_secure = true
+# auth toggling. (boolean value)
basic_auth_secure = false
-
[controller]
#
@@ -200,6 +284,47 @@ basic_auth_secure = false
# Minimum value: 1
#workers = 1
+# Set to True when controller will run in active-active mode. When set to
+# False, controller will flush any abandoned messages at startup. The
+# controller always restarts abandoned template translations at startup.
+# (boolean value)
+#concurrent = false
+concurrent = true
+
+# Time between checking for new plans. Default value is 1. (integer value)
+# Minimum value: 1
+#polling_interval = 1
+
+# (integer value)
+# Minimum value: 1
+#max_translation_counter = 1
+
+
+[data]
+
+#
+# From conductor
+#
+
+# Number of workers for data service. Default value is 1. (integer value)
+# Minimum value: 1
+#workers = 1
+
+# Set to True when data will run in active-active mode. When set to False, data
+# will flush any abandoned messages at startup. (boolean value)
+#concurrent = false
+concurrent = true
+
+# Default value is -8000, which is the diameter of the earth. The distance
+# cannot larger than this value (floating point value)
+#existing_placement_cost = -8000.0
+
+# (floating point value)
+#cloud_candidate_cost = 2.0
+
+# (floating point value)
+#service_candidate_cost = 1.0
+
[inventory_provider]
@@ -208,7 +333,7 @@ basic_auth_secure = false
#
# Extensions list to use (list value)
-# extensions = aai
+#extensions = aai
[messaging_server]
@@ -218,17 +343,22 @@ basic_auth_secure = false
#
# Music keyspace for messages (string value)
-keyspace = conductor_rpc
+#keyspace = conductor_rpc
# Wait interval while checking for a message response. Default value is 1
# second. (integer value)
# Minimum value: 1
#check_interval = 1
-# Overall message response timeout. Default value is 10 seconds. (integer
+# Overall message response timeout. Default value is 120 seconds. (integer
# value)
# Minimum value: 1
-timeout = 3600
+#response_timeout = 120
+
+# Timeout for detecting a VM is down, and other VMs can pick the plan up.
+# Default value is 5 minutes. (integer value) (integer value)
+# Minimum value: 1
+#timeout = 300
# Number of workers for messaging service. Default value is 1. (integer value)
# Minimum value: 1
@@ -242,25 +372,40 @@ timeout = 3600
#debug = false
+[multicloud]
+
+#
+# From conductor
+#
+
+# Base URL for Multicloud without a trailing slash. (string value)
+server_url = http://msb.onap.org:8082/api/multicloud
+
+# Timeout for Multicloud Rest Call (string value)
+#multicloud_rest_timeout = 30
+
+# Number of retry for Multicloud Rest Call (string value)
+#multicloud_retries = 3
+
+# The version of Multicloud API. (string value)
+#server_url_version = v0
+
+
[music_api]
#
# From conductor
#
-music_new_version = True
# Base URL for Music REST API without a trailing slash. (string value)
server_url = http://localhost:8080/MUSIC/rest/v2
version = v2
-music_version = "2.5.3"
-aafuser = conductor
-aafpass = c0nduct0r
-aafns = conductor
# DEPRECATED: List of hostnames (round-robin access) (list value)
# This option is deprecated for removal.
# Its value may be silently ignored in the future.
# Reason: Use server_url instead
+#hostnames = <None>
# DEPRECATED: Port (integer value)
# This option is deprecated for removal.
@@ -274,13 +419,74 @@ aafns = conductor
# Reason: Use server_url instead
#path = <None>
+# Socket connection timeout (floating point value)
+#connect_timeout = 3.05
+
+# Socket read timeout (floating point value)
+#read_timeout = 12.05
+
# Lock timeout (integer value)
#lock_timeout = 10
# Replication factor (integer value)
#replication_factor = 1
-# debug = false
+# Use mock API (boolean value)
+#mock = false
+
+# (string value)
+#music_topology = SimpleStrategy
+
+# Name of the first data center (string value)
+#first_datacenter_name = <None>
+
+# Number of replicas in first data center (integer value)
+#first_datacenter_replicas = <None>
+
+# Name of the second data center (string value)
+#second_datacenter_name = <None>
+
+# Number of replicas in second data center (integer value)
+#second_datacenter_replicas = <None>
+
+# Name of the third data center (string value)
+#third_datacenter_name = <None>
+
+# Number of replicas in third data center (integer value)
+#third_datacenter_replicas = <None>
+
+# new or old version (boolean value)
+#music_new_version = <None>
+music_new_version = True
+
+# for version (string value)
+#music_version = <None>
+music_version = "3.0.21"
+
+# username value that used for creating basic authorization header (string
+# value)
+#aafuser = <None>
+aafuser = conductor
+
+# password value that used for creating basic authorization header (string
+# value)
+#aafpass = <None>
+aafpass = c0nduct0r
+
+# AAF namespace field used in MUSIC request header (string value)
+#aafns = <None>
+aafns = conductor
+
+
+[prometheus]
+
+#
+# From conductor
+#
+
+# Prometheus Metrics Endpoint (list value)
+#metrics_port = 8000,8001,8002,8003,8004
+
[reservation]
@@ -294,12 +500,23 @@ aafns = conductor
#workers = 1
# Number of times reservation/release should be attempted. (integer value)
-#reserve_retries = 3
+#reserve_retries = 1
+
+# Timeout for detecting a VM is down, and other VMs can pick the plan up and
+# resereve. Default value is 600 seconds. (integer value) (integer value)
+# Minimum value: 1
+#timeout = 600
# Set to True when reservation will run in active-active mode. When set to
# False, reservation will restart any orphaned reserving requests at startup.
# (boolean value)
#concurrent = false
+concurrent = true
+
+# (integer value)
+# Minimum value: 1
+#max_reservation_counter = 1
+
[sdnc]
@@ -313,14 +530,23 @@ aafns = conductor
# Data Store table prefix. (string value)
#table_prefix = sdnc
-# Base URL for SDN-C. (string value)
+# Base URL for SDN-C, up to and including the version. (string value)
+#server_url = https://controller:8443/restconf/
server_url = http://localhost:8083/restconf/
# Basic Authentication Username (string value)
+#username = <None>
username = admin
# Basic Authentication Password (string value)
-password = admin
+#password = <None>
+password = Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+
+# Timeout for SDNC Rest Call (string value)
+#sdnc_rest_timeout = 30
+
+# Retry Numbers for SDNC Rest Call (string value)
+#sdnc_retries = 3
[service_controller]
@@ -330,7 +556,8 @@ password = admin
#
# Extensions list to use (list value)
-extensions = sdnc
+#extensions = sdnc
+
[solver]
@@ -342,29 +569,25 @@ extensions = sdnc
# Minimum value: 1
#workers = 1
+# The timeout value for solver service. Default value is 480 seconds. (integer
+# value)
+# Minimum value: 1
+#solver_timeout = 480
+
# Set to True when solver will run in active-active mode. When set to False,
# solver will restart any orphaned solving requests at startup. (boolean value)
#concurrent = false
+concurrent = true
+# Timeout for detecting a VM is down, and other VMs can pick the plan up. This
+# value should be larger than solver_timeoutDefault value is 10 minutes.
+# (integer value) (integer value)
+# Minimum value: 1
+#timeout = 600
-[multicloud]
-
-#
-# From conductor
-#
-
-# Base URL for Multicloud without a trailing slash. (string value)
-server_url = http://msb.onap.org:8082/api/multicloud
-
-# Timeout for Multicloud Rest Call (string value)
-multicloud_rest_timeout = 30
-
-# Number of retry for Multicloud Rest Call (string value)
-multicloud_retries = 3
-
-# The version of Multicloud API. (string value)
-server_url_version = v0
-
+# (integer value)
+# Minimum value: 1
+#max_solver_counter = 1
[vim_controller]
@@ -374,5 +597,4 @@ server_url_version = v0
#
# Extensions list to use (list value)
-extensions = multicloud
-
+#extensions = multicloud
diff --git a/scripts/optf-has/has/has_script.sh b/scripts/optf-has/has/has_script.sh
index 24ecc063..7f77dbbb 100755
--- a/scripts/optf-has/has/has_script.sh
+++ b/scripts/optf-has/has/has_script.sh
@@ -32,17 +32,13 @@ COND_CONF=/tmp/conductor/properties/conductor.conf
LOG_CONF=/tmp/conductor/properties/log.conf
IMAGE_NAME=nexus3.onap.org:10001/onap/optf-has
IMAGE_VER=1.2.1-SNAPSHOT-latest
-CERT=/tmp/conductor/properties/cert.cer
-KEY=/tmp/conductor/properties/cert.key
-BUNDLE=/tmp/conductor/properties/cert.pem
+BUNDLE=/tmp/conductor/properties/AAF_RootCA.cer
mkdir -p /tmp/conductor/properties
mkdir -p /tmp/conductor/logs
cp ${WORKSPACE}/scripts/optf-has/has/has-properties/conductor.conf.onap /tmp/conductor/properties/conductor.conf
cp ${WORKSPACE}/scripts/optf-has/has/has-properties/log.conf.onap /tmp/conductor/properties/log.conf
-cp ${WORKSPACE}/scripts/optf-has/has/has-properties/cert.cer /tmp/conductor/properties/cert.cer
-cp ${WORKSPACE}/scripts/optf-has/has/has-properties/cert.key /tmp/conductor/properties/cert.key
-cp ${WORKSPACE}/scripts/optf-has/has/has-properties/cert.pem /tmp/conductor/properties/cert.pem
+cp ${WORKSPACE}/scripts/optf-has/has/has-properties/AAF_RootCA.cer /tmp/conductor/properties/AAF_RootCA.cer
#chmod -R 777 /tmp/conductor/properties
MUSIC_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-tomcat`
@@ -63,23 +59,29 @@ echo "MULTICLOUDSIM_IP=${MULTICLOUDSIM_IP}"
# change MULTICLOUD reference to the local instance
sed -i -e "s%msb.onap.org:8082/%${MULTICLOUDSIM_IP}:8082/%g" /tmp/conductor/properties/conductor.conf
+AAFSIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' aafsim`
+echo "AAFSIM_IP=${AAFSIM_IP}"
+
+# change AAF reference to the local instance
+sed -i -e "s%localhost:8100/%${AAFSIM_IP}:8100/%g" /tmp/conductor/properties/conductor.conf
+
#onboard conductor into music
echo "Query MUSIC to check for reachability. Query Version"
curl -vvvvv --noproxy "*" --request GET http://${MUSIC_IP}:8080/MUSIC/rest/v2/version -H "Content-Type: application/json"
-
+
echo "Onboard conductor into music"
-curl -vvvvv --noproxy "*" --request POST http://${MUSIC_IP}:8080/MUSIC/rest/v2/admin/onboardAppWithMusic -H "Content-Type: application/json" --data @${WORKSPACE}/tests/optf-has/has/data/onboard.json
+curl -vvvvv --noproxy "*" --request POST http://${MUSIC_IP}:8080/MUSIC/rest/v2/admin/onboardAppWithMusic -H "Content-Type: application/json" -H "Authorization: Basic Y29uZHVjdG9yOmMwbmR1Y3Qwcg==" --data @${WORKSPACE}/tests/optf-has/has/data/onboard.json
docker run -d --name cond-cont -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-controller --config-file=/usr/local/bin/conductor.conf
-sleep 20
+sleep 15
docker run -d --name cond-api -p "8091:8091" -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-api --port=8091 -- --config-file=/usr/local/bin/conductor.conf
-sleep 20
+sleep 15
docker run -d --name cond-solv -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-solver --config-file=/usr/local/bin/conductor.conf
-sleep 20
+sleep 15
docker run -d --name cond-resv -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-reservation --config-file=/usr/local/bin/conductor.conf
-sleep 20
-docker run -d --name cond-data -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf -v ${CERT}:/usr/local/bin/cert.cer -v ${KEY}:/usr/local/bin/cert.key -v ${BUNDLE}:/usr/local/bin/cert.pem ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-data --config-file=/usr/local/bin/conductor.conf
-sleep 20
+sleep 5
+docker run -d --name cond-data -v ${COND_CONF}:/usr/local/bin/conductor.conf -v ${LOG_CONF}:/usr/local/bin/log.conf -v ${BUNDLE}:/usr/local/bin/AAF_RootCA.cer ${IMAGE_NAME}:${IMAGE_VER} python /usr/local/bin/conductor-data --config-file=/usr/local/bin/conductor.conf
+sleep 15
COND_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' cond-api`
${WORKSPACE}/scripts/optf-has/has/wait_for_port.sh ${COND_IP} 8091
diff --git a/scripts/optf-has/has/music_script.sh b/scripts/optf-has/has/music_script.sh
index 811a39c2..2a4f178d 100755
--- a/scripts/optf-has/has/music_script.sh
+++ b/scripts/optf-has/has/music_script.sh
@@ -22,67 +22,120 @@ echo "### This is ${WORKSPACE}/scripts/optf-has/has/music_script.sh"
#
# add here all the configuration steps eventually needed to be carried out for music CSIT testing
#
-echo "# music configuration step";
-
-CASS_IMG=nexus3.onap.org:10001/onap/music/cassandra_music:latest
-TOMCAT_IMG=nexus3.onap.org:10001/library/tomcat:8.0
+echo "########## music configuration step ##########";
+CASS_IMG=nexus3.onap.org:10001/onap/music/cassandra_3_11:latest
+CASS_IMG_JOB=nexus3.onap.org:10001/onap/music/cassandra_job:latest
+TOMCAT_IMG=nexus3.onap.org:10001/library/tomcat:8.5
ZK_IMG=nexus3.onap.org:10001/library/zookeeper:3.4
-MUSIC_IMG=nexus3.onap.org:10001/onap/music/music:2.5.3
+BUSYBOX_IMG=nexus3.onap.org:10001/library/busybox:latest
+MUSIC_IMG=nexus3.onap.org:10001/onap/music/music:latest
+TT=10
WORK_DIR=/tmp/music
CASS_USERNAME=nelson24
CASS_PASSWORD=winman123
MUSIC_SOURCE_PROPERTIES=${WORKSPACE}/scripts/optf-has/has/music-properties
MUSIC_PROPERTIES=/tmp/music/properties
MUSIC_LOGS=/tmp/music/logs
+CQL_FILES=${WORKSPACE}/scripts/music/cql
+MUSIC_TRIGGER_DIR=/tmp/triggers
+TRIGGER_JAR=musictrigger-0.1.0.jar
+TRIGGER_JAR_URL=https://nexus.onap.org/service/local/repositories/autorelease-72298/content/org/onap/music/musictrigger/0.1.0/musictrigger-0.1.0.jar
+
mkdir -p ${MUSIC_PROPERTIES}
mkdir -p ${MUSIC_LOGS}
+mkdir -p ${MUSIC_LOGS}/MUSIC
+mkdir -p /tmp/triggers
+
+# Get Trigger
+echo "########## Get Trigger Jar ##########"
+curl -o $MUSIC_TRIGGER_DIR/$TRIGGER_JAR $TRIGGER_JAR_URL
cp ${MUSIC_SOURCE_PROPERTIES}/* ${WORK_DIR}/properties
# Create Volume for mapping war file and tomcat
+echo "########## create music-vol ##########"
docker volume create --name music-vol;
# Create a network for all the containers to run in.
+echo "########## create music-net ##########"
docker network create music-net;
# Start Cassandra
-docker run -d --name music-db --network music-net -p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" -e CASSUSER=${CASS_USERNAME} -e CASSPASS=${CASS_PASSWORD} ${CASS_IMG};
-#CASSA_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-db`
+echo "########## Start Cassandra (music-db) ##########"
+docker run -d --name music-db --network music-net -p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" \
+-v $MUSIC_TRIGGER_DIR/$TRIGGER_JAR:/etc/cassandra/triggers/$TRIGGER_JAR \
+${CASS_IMG};
+
CASSA_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-db`
echo "CASSANDRA_IP=${CASSA_IP}"
${WORKSPACE}/scripts/optf-has/has/wait_for_port.sh ${CASSA_IP} 9042
-sleep 150
+
+# See if cassandra is up.
+echo "########## Running Test to see if Cassandra is up ##########"
+docker run --name music-casstest --network music-net \
+$BUSYBOX_IMG sh -c "until nc -z music-db 9042 && echo "success"; do echo 'No connection .. Sleeping for $TT seconds';sleep $TT; done;"
+
+# Check to see if Keyspaces are there.
+docker exec music-db cqlsh -u cassandra -p cassandra -e "DESCRIBE keyspaces;"
+
+sleep 10;
+
+# Load data into Cassandra via Cassandra Job
+echo "########## Running Cassandra Job (music-job) to load cql files ##########"
+docker run -d --name music-job --network music-net \
+-v $CQL_FILES/admin.cql:/cql/admin.cql \
+-v $CQL_FILES/admin_pw.cql:/cql/admin_pw.cql \
+-v $CQL_FILES/extra:/cql/extra \
+-e PORT=9042 \
+-e CASS_HOSTNAME=music-db \
+-e USERNAME=$CASS_USERNAME \
+-e PASSWORD=$CASS_PASSWORD \
+$CASS_IMG_JOB
+# Logs
+echo "########## Cassandra Job logs ##########"
+docker logs music-job
+
# Start Music war
+echo "########## Start music-war ##########"
docker run -d --name music-war -v music-vol:/app ${MUSIC_IMG};
-sleep 30
+
# Start Zookeeper
+echo "########## Start zookeeper (music-zk) ##########"
docker run -d --name music-zk --network music-net -p "2181:2181" -p "2888:2888" -p "3888:3888" ${ZK_IMG};
-#ZOO_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-zk`
+
ZOO_IP=`docker inspect -f '{{ $network := index .NetworkSettings.Networks "music-net" }}{{ $network.IPAddress}}' music-zk`
echo "ZOOKEEPER_IP=${ZOO_IP}"
# Delay between Cassandra/Zookeeper and Tomcat
-sleep 120
+sleep 10;
# Start Up tomcat - Needs to have properties,logs dir and war file volume mapped.
+echo "########## Start Tomcat (music-tomcat) ##########"
docker run -d --name music-tomcat --network music-net -p "8080:8080" -v music-vol:/usr/local/tomcat/webapps -v ${WORK_DIR}/properties:/opt/app/music/etc:ro -v ${WORK_DIR}/logs:/opt/app/music/logs ${TOMCAT_IMG};
# Connect tomcat to host bridge network so that its port can be seen.
+echo "########## Create Bridge for Tomcat ##########"
docker network connect bridge music-tomcat;
-#
-# add here below the start of all docker containers needed for music CSIT testing
-#
-
TOMCAT_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' music-tomcat`
echo "TOMCAT_IP=${TOMCAT_IP}"
${WORKSPACE}/scripts/optf-has/has/wait_for_port.sh ${TOMCAT_IP} 8080
-# wait a while to make sure music is totally up and configured
-sleep 90
+sleep 20;
+echo "########## TOMCAT Logs ##########"
+docker logs music-tomcat
+# Needed only if we need to look at localhost logs.
+echo "########## MUSIC localhost Log ##########"
+docker exec music-tomcat /bin/bash -c "cat /usr/local/tomcat/logs/localhost*"
+
+echo "########## MUSIC Log ##########"
+ls -al $MUSIC_LOGS/MUSIC
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/music.log"
+#echo "########## MUSIC error log ##########"
+#docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/error.log"
-echo "inspect docker things for tracing purpose"
+echo "########## inspect docker things for tracing purpose ##########"
docker inspect music-db
docker inspect music-zk
docker inspect music-tomcat
@@ -90,11 +143,20 @@ docker inspect music-war
docker volume inspect music-vol
docker network inspect music-net
-echo "dump music content just after music is started"
+echo "########## dump music content just after music is started ##########"
docker exec music-db /usr/bin/nodetool status
docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM system_schema.keyspaces'
+docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'DESCRIBE keyspace admin'
docker exec music-db /usr/bin/cqlsh -unelson24 -pwinman123 -e 'SELECT * FROM admin.keyspace_master'
+#
+# add here all ROBOT_VARIABLES settings
+#
+echo "########## music robot variables settings ##########";
+ROBOT_VARIABLES="-v MUSIC_HOSTNAME:http://${TOMCAT_IP} -v MUSIC_PORT:8080 -v COND_HOSTNAME:http://localhost -v COND_PORT:8091"
+
+echo ${ROBOT_VARIABLES}
+
diff --git a/scripts/optf-has/has/music_teardown_script.sh b/scripts/optf-has/has/music_teardown_script.sh
index 605ebd4e..e05ef9d1 100755
--- a/scripts/optf-has/has/music_teardown_script.sh
+++ b/scripts/optf-has/has/music_teardown_script.sh
@@ -14,15 +14,40 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-echo "music scripts docker containers killing";
+
+
+#
+# add here below the killing of all docker containers used for music CSIT testing
+#
+echo "dump music.log files"
+ls -alF /tmp/music
+ls -alFR /tmp/music
+ls -alF /tmp/music/properties
+cat /tmp/music/properties/music.properties
+echo "===== MUSIC log =================="
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/music.log"
+#cat /tmp/music/logs/MUSIC/music.log
+echo "===== MUSIC error log =================="
+docker exec music-tomcat /bin/bash -c "cat /opt/app/music/logs/MUSIC/error.log"
+#cat /tmp/music/logs/MUSIC/error.log
+
+echo "##########################################################";
+echo "#";
+echo "# music scripts docker containers killing";
+echo "#";
+echo "##########################################################";
docker stop music-tomcat
docker stop music-war
docker stop music-zk
+docker stop music-job
+docker stop music-casstest
docker stop music-db
docker rm music-zk
docker rm music-tomcat
docker rm music-war
+docker rm music-job
+docker rm music-casstest
docker rm music-db
docker network rm music-net;
@@ -30,10 +55,9 @@ sleep 5;
docker volume rm music-vol
-echo "dump music.log files"
-ls -alF /tmp/music
-ls -alF /tmp/music/properties
-cat /tmp/music/properties/music.properties
-#cat /tmp/music/logs/MUSIC/music.log
-cat /tmp/music/logs/MUSIC/error.log
+#rm -Rf /tmp/music
+
+
+
+
diff --git a/scripts/optf-has/has/simulator_script.sh b/scripts/optf-has/has/simulator_script.sh
index 42dcd57f..ccb479b2 100755
--- a/scripts/optf-has/has/simulator_script.sh
+++ b/scripts/optf-has/has/simulator_script.sh
@@ -53,7 +53,7 @@ cat ./Dockerfile
docker build -t aaisim .
# run aaisim
-docker run -d --name aaisim -p 8081:8081 aaisim
+docker run -d --name aaisim -p 8081:8081 aaisim
AAISIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' aaisim`
echo "AAISIM_IP=${AAISIM_IP}"
@@ -77,9 +77,32 @@ echo "MULTICLOUDSIM_IP=${MULTICLOUDSIM_IP}"
${WORKSPACE}/scripts/optf-has/has/wait_for_port.sh ${MULTICLOUDSIM_IP} 8082
+# prepare aafsim
+echo "simulator_script: prepare aafsim "
+cd ${WORK_DIR}/has/conductor/conductor/tests/functional/simulators/aafsim/
+
+# check Dockerfile content
+echo "simulator_script: Dockerfile "
+cat ./Dockerfile
+
+# build aafsim
+echo "simulator_script: build docker "
+docker build -t aafsim .
+
+# run aafsim
+echo "simulator_script: run docker "
+docker run -d --name aafsim -p 8100:8100 aafsim
+
+AAFSIM_IP=`docker inspect --format '{{ .NetworkSettings.Networks.bridge.IPAddress}}' aafsim`
+echo "simulator_script: AAFSIM_IP=${AAFSIM_IP}"
+
+#echo "simulator_script: wait_for_port"
+${WORKSPACE}/scripts/optf-has/has/wait_for_port.sh ${AAFSIM_IP} 8100
+
# wait a while before continuing
sleep 2
echo "inspect docker things for tracing purpose"
docker inspect aaisim
docker inspect multicloudsim
+docker inspect aafsim
diff --git a/scripts/optf-has/has/simulator_teardown_script.sh b/scripts/optf-has/has/simulator_teardown_script.sh
index a2edd332..eb29445a 100755
--- a/scripts/optf-has/has/simulator_teardown_script.sh
+++ b/scripts/optf-has/has/simulator_teardown_script.sh
@@ -17,6 +17,8 @@
echo "optf/has scripts docker containers killing";
docker stop aaisim
docker stop multicloudsim
+docker stop aafsim
docker rm aaisim
docker rm multicloudsim
+docker rm aafsim
diff --git a/tests/optf-has/has/optf_has_test.robot b/tests/optf-has/has/optf_has_test.robot
index 3b3ee7a0..8bd313a9 100644
--- a/tests/optf-has/has/optf_has_test.robot
+++ b/tests/optf-has/has/optf_has_test.robot
@@ -5,6 +5,11 @@ Library json
*** Variables ***
${MESSAGE} {"ping": "ok"}
+${BASIC} Basic
+${Music_AUTHVALUE} Y29uZHVjdG9yOmMwbmR1Y3Qwcg==
+${HAS_AUTHVALUE} YWRtaW4xOnBsYW4uMTU=
+${Music_Auth} ${BASIC} ${Music_AUTHVALUE}
+${HAS_Auth} ${BASIC} ${HAS_AUTHVALUE}
${RESP_STATUS} "error"
${RESP_MESSAGE_WRONG_VERSION} "conductor_template_version must be one of: 2016-11-01"
${RESP_MESSAGE_WITHOUT_DEMANDS} Undefined Demand
@@ -54,7 +59,7 @@ Check Music War Docker Container
Get Music Version
[Documentation] It sends a REST GET request to retrieve the Music.war version
Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request musicaas /MUSIC/rest/v2/version headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -109,7 +114,7 @@ Check ConductorData Docker Container
Get Root Url
[Documentation] It sends a REST GET request to root url
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond / headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -121,7 +126,7 @@ Conductor AddHealthcheck Row Into Music
[Documentation] It sends a REST PUT request to Music to inject healthcheck plan
Create Session musicaas ${MUSIC_HOSTNAME}:${MUSIC_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}healthcheck.json
- &{headers}= Create Dictionary ns=conductor userId=conductor password=c0nduct0r Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary ns=conductor Authorization=${Music_Auth} userId=conductor password=c0nduct0r Content-Type=application/json Accept=application/json
${resp}= Put Request musicaas /MUSIC/rest/v2/keyspaces/conductor/tables/plans/rows?id=healthcheck data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -133,7 +138,7 @@ Conductor AddHealthcheck Row Into Music
Healthcheck
[Documentation] It sends a REST GET request to healthcheck url
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/healthcheck headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -144,7 +149,7 @@ SendPlanWithWrongVersion
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_wrong_version.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -159,7 +164,7 @@ SendPlanWithWrongVersion
GetPlanWithWrongVersion
[Documentation] It sends a REST GET request to capture error
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -175,7 +180,7 @@ SendPlanWithoutDemandSection
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_without_demand_section.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -190,7 +195,7 @@ SendPlanWithoutDemandSection
GetPlanWithoutDemandSection
[Documentation] It sends a REST GET request to capture error
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -206,7 +211,7 @@ SendPlanWithWrongConstraint
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_wrong_distance_constraint.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -221,7 +226,7 @@ SendPlanWithWrongConstraint
GetPlanWithWrongConstraint
[Documentation] It sends a REST GET request to capture error
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -238,7 +243,7 @@ SendPlanWithLatiAndLongi
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_lati_and_longi.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -253,7 +258,7 @@ SendPlanWithLatiAndLongi
GetPlanWithLatiAndLongi
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -269,7 +274,7 @@ SendPlanWithShortDistanceConstraint
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_short_distance_constraint.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -284,7 +289,7 @@ SendPlanWithShortDistanceConstraint
GetPlanWithShortDistanceConstraint
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -300,7 +305,7 @@ SendPlanWithVimFit
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_vim_fit.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -315,7 +320,7 @@ SendPlanWithVimFit
GetPlanWithVimFit
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -331,7 +336,7 @@ SendPlanWithHpa
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -346,7 +351,7 @@ SendPlanWithHpa
GetPlanWithHpa
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -362,7 +367,7 @@ SendPlanWithHpaSimple
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_simple.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -377,7 +382,7 @@ SendPlanWithHpaSimple
GetPlanWithHpaSimple
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -393,7 +398,7 @@ SendPlanWithHpaMandatory
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_requirements_mandatory.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -408,7 +413,7 @@ SendPlanWithHpaMandatory
GetPlanWithHpaMandatory
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -424,7 +429,7 @@ SendPlanWithHpaOptionals
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_requirements_optionals.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -439,7 +444,7 @@ SendPlanWithHpaOptionals
GetPlanWithHpaOptionals
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -455,7 +460,7 @@ SendPlanWithHpaUnmatched
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_unmatched.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -470,7 +475,7 @@ SendPlanWithHpaUnmatched
GetPlanWithHpaUnmatched
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -487,7 +492,7 @@ SendPlanWithHpaScoreMultiObj
[Documentation] It sends a POST request to conductor
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
${data}= Get Binary File ${CURDIR}${/}data${/}plan_with_hpa_score_multi_objective.json
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Post Request optf-cond /v1/plans data=${data} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}
@@ -502,7 +507,7 @@ SendPlanWithHpaScoreMultiObj
GetPlanWithHpaScoreMultiObj
[Documentation] It sends a REST GET request to capture recommendations
Create Session optf-cond ${COND_HOSTNAME}:${COND_PORT}
- &{headers}= Create Dictionary Content-Type=application/json Accept=application/json
+ &{headers}= Create Dictionary Authorization=${HAS_Auth} Content-Type=application/json Accept=application/json
${resp}= Get Request optf-cond /v1/plans/${generatedPlanId} headers=${headers}
Log To Console *********************
Log To Console response = ${resp}