Skip to content

Commit

Permalink
Merge pull request #71 from bmpotter/add-agreementLess
Browse files Browse the repository at this point in the history
added agreementLess attr to pattern
  • Loading branch information
bmpotter authored Apr 16, 2018
2 parents 8e0a9eb + 74a0ded commit f3b07c9
Show file tree
Hide file tree
Showing 9 changed files with 29 additions and 22 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ services in the exchange.
- Allow random PW creation for user creation
- Consider changing all creates to POST, and update (via put/patch) return codes to 200

## Changes in 1.54.0

- Added `agreementLess` attribute to `services` section of pattern

## Changes in 1.53.0

- If POST /services/{svcid}/dockerauths is a dup, just update the current one
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.53.0
1.54.0
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ trait PatternRoutes extends ScalatraBase with FutureSupport with SwaggerSupport
"serviceUrl": "https://bluehorizon.network/services/weather",
"serviceOrgid": "myorg",
"serviceArch": "amd64",
"agreementLess": false, // only set to true if the same svc is both top level and required by another svc
// If multiple service versions are listed, Horizon will try to automatically upgrade nodes to the version with the lowest priority_value number
"serviceVersions": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import scala.collection.mutable.ListBuffer
/** Contains the object representations of the DB tables related to patterns. */

case class PWorkloads(workloadUrl: String, workloadOrgid: String, workloadArch: String, workloadVersions: List[PServiceVersions], dataVerification: Option[Map[String,Any]], nodeHealth: Option[Map[String,Int]])
case class PServices(serviceUrl: String, serviceOrgid: String, serviceArch: String, serviceVersions: List[PServiceVersions], dataVerification: Option[Map[String,Any]], nodeHealth: Option[Map[String,Int]])
case class PServices(serviceUrl: String, serviceOrgid: String, serviceArch: String, agreementLess: Option[Boolean], serviceVersions: List[PServiceVersions], dataVerification: Option[Map[String,Any]], nodeHealth: Option[Map[String,Int]])
//case class POldWorkloads(workloadUrl: String, workloadOrgid: String, workloadArch: String, workloadVersions: List[PWorkloadVersions], dataVerification: Map[String,Any])
case class PServiceVersions(version: String, deployment_overrides: String, deployment_overrides_signature: String, priority: Map[String,Int], upgradePolicy: Map[String,String])
case class PDataVerification(enabled: Boolean, URL: String, user: String, password: String, interval: Int, check_rate: Int, metering: Map[String,Any])
Expand Down
1 change: 1 addition & 0 deletions src/test/bash/primedb.sh
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@ if [[ $rc != 200 ]]; then
"serviceUrl": "'$svc2url'",
"serviceOrgid": "'$orgid'",
"serviceArch": "'$svc2arch'",
"agreementLess": false,
"serviceVersions": [
{
"version": "'$svc2version'",
Expand Down
4 changes: 2 additions & 2 deletions src/test/scala/exchangeapi/AgbotsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ class AgbotsSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" and check that agbot can read it") {
val input = PostPutPatternRequest(pattern, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand Down Expand Up @@ -349,7 +349,7 @@ class AgbotsSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern2+" - add "+pattern2) {
val input = PostPutPatternRequest(pattern2, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern2).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand Down
2 changes: 1 addition & 1 deletion src/test/scala/exchangeapi/FrontEndSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ class FrontEndSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - create "+pattern) {
val input = PostPutPatternRequest(ptBase, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(TYPEUSER).headers(IDUSER).headers(ORGHEAD).headers(ISSUERHEAD).asString
Expand Down
4 changes: 2 additions & 2 deletions src/test/scala/exchangeapi/NodesSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ class NodesSuite extends FunSuite {
val input = PostPutPatternRequest(patid, "desc", public = false, None,
Some(List(
// Reference both services in the pattern so we can search on both later on
PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map(), Map())), None, None ),
PServices(svcurl2, orgid, svcarch2, List(PServiceVersions(svcversion2, "", "", Map(), Map())), None, None )
PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map(), Map())), None, None ),
PServices(svcurl2, orgid, svcarch2, Some(true), List(PServiceVersions(svcversion2, "", "", Map(), Map())), None, None )
)),
List[Map[String,String]]()
)
Expand Down
31 changes: 16 additions & 15 deletions src/test/scala/exchangeapi/PatternsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ class PatternsSuite extends FunSuite {
val ptBase2 = "pt9921"
val pattern2 = ptBase2
val orgpattern2 = authpref+pattern2
val ptBase3 = "pt9922"
val pattern3 = ptBase3
//val ptBase3 = "pt9922"
//val pattern3 = ptBase3
val keyId = "mykey.pem"
val key = "abcdefghijk"
val keyId2 = "mykey2.pem"
Expand Down Expand Up @@ -128,9 +128,9 @@ class PatternsSuite extends FunSuite {
assert(agbotResponse.code === HttpCode.PUT_OK)
}

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" before service is exists - should fail") {
test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" before service exists - should fail") {
val input = PostPutPatternRequest(ptBase, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -154,7 +154,7 @@ class PatternsSuite extends FunSuite {

test("PUT /orgs/"+orgid+"/patterns/"+pattern+" - update pattern that is not there yet - should fail") {
val input = PostPutPatternRequest("Bad Pattern", "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("put").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -164,7 +164,7 @@ class PatternsSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" that is not signed - should fail") {
val input = PostPutPatternRequest(ptBase, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "{\"services\":{}}", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "{\"services\":{}}", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -174,7 +174,7 @@ class PatternsSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" as user") {
val input = PostPutPatternRequest(ptBase, "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "{\"services\":{}}", "a", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, Some(true), List(PServiceVersions(svcversion, "{\"services\":{}}", "a", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -186,7 +186,7 @@ class PatternsSuite extends FunSuite {

test("POST /orgs/"+orgid+"/patterns/"+pattern+" - add "+pattern+" again - should fail") {
val input = PostPutPatternRequest("Bad Pattern", "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("post").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -196,7 +196,7 @@ class PatternsSuite extends FunSuite {

test("PUT /orgs/"+orgid+"/patterns/"+pattern+" - update as same user, w/o dataVerification or nodeHealth fields") {
val input = PostPutPatternRequest(ptBase+" amd64", "desc", public = false, Some(List()), // <- specify empty workloads field to make sure it is allowed
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), None, None ))),
Some(List( PServices(svcurl, orgid, svcarch, Some(true), List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), None, None ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("put").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -206,7 +206,7 @@ class PatternsSuite extends FunSuite {

test("PUT /orgs/"+orgid+"/patterns/"+pattern+" - update as 2nd user - should fail") {
val input = PostPutPatternRequest("Bad Pattern", "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("put").headers(CONTENT).headers(ACCEPT).headers(USER2AUTH).asString
Expand All @@ -216,7 +216,7 @@ class PatternsSuite extends FunSuite {

test("PUT /orgs/"+orgid+"/patterns/"+pattern+" - update as agbot - should fail") {
val input = PostPutPatternRequest("Bad Pattern", "desc", public = false, None,
Some(List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
Some(List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map("priority_value" -> 50), Map("lifecycle" -> "immediate"))), Some(Map("enabled"->false, "URL"->"", "user"->"", "password"->"", "interval"->0, "check_rate"->0, "metering"->Map[String,Any]())), Some(Map("check_agreement_status" -> 120)) ))),
List[Map[String,String]]()
)
val response = Http(URL+"/patterns/"+pattern).postData(write(input)).method("put").headers(CONTENT).headers(ACCEPT).headers(AGBOTAUTH).asString
Expand Down Expand Up @@ -292,12 +292,13 @@ class PatternsSuite extends FunSuite {
assert(respObj.patterns.size === 2)

assert(respObj.patterns.contains(orgpattern))
var pt = respObj.patterns(orgpattern) // the 2nd get turns the Some(val) into val
var pt = respObj.patterns(orgpattern)
assert(pt.label === ptBase+" amd64")
assert(pt.owner === orguser)
assert(pt.services.head.agreementLess.get === true)

assert(respObj.patterns.contains(orgpattern2))
pt = respObj.patterns(orgpattern2) // the 2nd get turns the Some(val) into val
pt = respObj.patterns(orgpattern2)
assert(pt.label === ptBase2+" amd64")
assert(pt.owner === orguser2)
}
Expand Down Expand Up @@ -402,7 +403,7 @@ class PatternsSuite extends FunSuite {
}

test("PATCH /orgs/"+orgid+"/patterns/"+pattern+" - patch the service") {
val input = List( PServices(svcurl, orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map()), Some(Map()) ))
val input = List( PServices(svcurl, orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map()), Some(Map()) ))
val jsonInput = """{ "services": """ + write(input) + " }"
//info("jsonInput: "+jsonInput)
val response = Http(URL+"/patterns/"+pattern).postData(jsonInput).method("patch").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
Expand All @@ -411,7 +412,7 @@ class PatternsSuite extends FunSuite {
}

test("PATCH /orgs/"+orgid+"/patterns/"+pattern+" - patch with a nonexistent service - should fail") {
val input = List( PServices("foo", orgid, svcarch, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map()), Some(Map()) ))
val input = List( PServices("foo", orgid, svcarch, None, List(PServiceVersions(svcversion, "", "", Map(), Map())), Some(Map()), Some(Map()) ))
val jsonInput = """{ "services": """ + write(input) + " }"
val response = Http(URL+"/patterns/"+pattern).postData(jsonInput).method("patch").headers(CONTENT).headers(ACCEPT).headers(USERAUTH).asString
info("code: "+response.code+", response.body: "+response.body)
Expand Down

0 comments on commit f3b07c9

Please sign in to comment.