summaryrefslogtreecommitdiffstats
path: root/source/test/promise-intents.coffee
diff options
context:
space:
mode:
authorPeter Lee <peter@corenova.com>2016-01-29 15:21:56 -0800
committerPeter Lee <peter@corenova.com>2016-01-29 15:21:56 -0800
commita46af646972b6ff263fb207d28a59e7ce7417b5c (patch)
tree644d9cb2fead71ddf00c2a83219040288e23d471 /source/test/promise-intents.coffee
parente16a07cdc9016c03aff00cd10076dfd2d4a142da (diff)
added copy of github.com/opnfv/promise source into the source directory
Change-Id: Ib212302a4132aa492f7b701a7ca02f54a7d0a6af
Diffstat (limited to 'source/test/promise-intents.coffee')
-rw-r--r--source/test/promise-intents.coffee437
1 files changed, 437 insertions, 0 deletions
diff --git a/source/test/promise-intents.coffee b/source/test/promise-intents.coffee
new file mode 100644
index 0000000..8e6286b
--- /dev/null
+++ b/source/test/promise-intents.coffee
@@ -0,0 +1,437 @@
+config = require 'config'
+assert = require 'assert'
+forge = require 'yangforge'
+app = forge.load '!yaml ../promise.yaml', async: false, pkgdir: __dirname
+
+# this is javascript promise framework and not related to opnfv-promise
+promise = require 'promise'
+
+if process.env.DEBUG
+ debug = console.log
+else
+ debug = ->
+
+# in the future with YF 0.12.x
+# app = forge.load('..').build('test')
+# app.set config
+# app.use 'proxy', target: x.x.x.x:5050, interface: 'restjson'
+
+describe "promise", ->
+ before ->
+ # ensure we have valid OpenStack environment to test against
+ try
+ config.get 'openstack.auth.endpoint'
+ catch e
+ throw new Error "missing OpenStack environmental variables"
+
+
+ # below 'provider' is used across test suites
+ provider = undefined
+
+ # Test Scenario 00 (FUTURE)
+ # describe "prepare OpenStack for testing", ->
+ # before (done) ->
+ # # ensure we have valid OpenStack environment to test against
+ # try
+ # config.get 'openstack.auth.url'
+ # catch e
+ # throw new Error "missing OpenStack environmental variables"
+
+ # os = forge.load '!yaml ../openstack.yaml', async: false, pkgdir: __dirname
+ # app.attach 'openstack', os.access 'openstack'
+ # app.set config
+
+ # describe "authenticate", ->
+ # it "should retrieve available service catalog", (done) ->
+ # app.access('openstack').invoke 'authenticate'
+ # .then (res) ->
+
+ # done()
+ # .catch (err) -> done err
+
+ # describe "create-tenant", ->
+ # # create a new tenant for testing purposes
+
+ # describe "upload-image", ->
+ # # upload a new test image
+
+
+
+ # Test Scenario 01
+ describe "register OpenStack into resource pool", ->
+ pool = undefined
+
+ # TC-01
+ describe "add-provider", ->
+ it "should add a new OpenStack provider without error", (done) ->
+ @timeout 5000
+
+ auth = config.get 'openstack.auth'
+ auth['provider-type'] = 'openstack'
+
+ app.access('opnfv-promise').invoke 'add-provider', auth
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ provider = id: res.get('provider-id')
+ # HACK - we delay by a second to allow time for discovering capacity and flavors
+ setTimeout done, 1000
+ .catch (err) -> done err
+
+ it "should update promise.providers with a new entry", ->
+ app.get('opnfv-promise.promise.providers').should.have.length(1)
+
+ it "should contain a new ResourceProvider record in the store", ->
+ assert provider?.id?, "unable to check without ID"
+ provider = app.access('opnfv-promise').find('ResourceProvider', provider.id)
+ assert provider?
+
+ # TC-02
+ describe "increase-capacity", ->
+ it "should add more capacity to the reservation service without error", (done) ->
+ app.access('opnfv-promise').invoke 'increase-capacity',
+ source: provider
+ capacity:
+ cores: 20
+ ram: 51200
+ instances: 10
+ addresses: 10
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ pool = id: res.get('pool-id')
+ done()
+ .catch (err) -> done err
+
+ it "should update promise.pools with a new entry", ->
+ app.get('opnfv-promise.promise.pools').should.have.length(1)
+
+ it "should contain a ResourcePool record in the store", ->
+ assert pool?.id?, "unable to check without ID"
+ pool = app.access('opnfv-promise').find('ResourcePool', pool.id)
+ assert pool?
+
+ # TC-03
+ describe "query-capacity", ->
+ it "should report total collections and utilizations", (done) ->
+ app.access('opnfv-promise').invoke 'query-capacity',
+ capacity: 'total'
+ .then (res) ->
+ res.get('collections').should.be.Array
+ res.get('collections').length.should.be.above(0)
+ res.get('utilization').should.be.Array
+ res.get('utilization').length.should.be.above(0)
+ done()
+ .catch (err) -> done err
+
+ it "should contain newly added capacity pool", (done) ->
+ app.access('opnfv-promise').invoke 'query-capacity',
+ capacity: 'total'
+ .then (res) ->
+ res.get('collections').should.containEql "ResourcePool:#{pool.id}"
+ done()
+ .catch (err) -> done err
+
+ # Test Scenario 02
+ describe "allocation without reservation", ->
+
+ # TC-04
+ describe "create-instance", ->
+ allocation = undefined
+ instance_id = undefined
+
+ before ->
+ # XXX - need to determine image and flavor to use in the given provider for this test
+ assert provider?,
+ "unable to execute without registered 'provider'"
+
+ it "should create a new server in target provider without error", (done) ->
+ @timeout 5000
+ test = config.get 'openstack.test'
+ app.access('opnfv-promise').invoke 'create-instance',
+ 'provider-id': provider.id
+ name: 'promise-test-no-reservation'
+ image: test.image
+ flavor: test.flavor
+ networks: [ test.network ]
+ .then (res) ->
+ debug res.get()
+ res.get('result').should.equal 'ok'
+ instance_id = res.get('instance-id')
+ done()
+ .catch (err) -> done err
+
+ it "should update promise.allocations with a new entry", ->
+ app.get('opnfv-promise.promise.allocations').length.should.be.above(0)
+
+ it "should contain a new ResourceAllocation record in the store", ->
+ assert instance_id?, "unable to check without ID"
+ allocation = app.access('opnfv-promise').find('ResourceAllocation', instance_id)
+ assert allocation?
+
+ it "should reference the created server ID from the provider", ->
+ assert allocation?, "unable to check without record"
+ allocation.get('instance-ref').should.have.property('provider')
+ allocation.get('instance-ref').should.have.property('server')
+
+ it "should have low priority state", ->
+ assert allocation?, "unable to check without record"
+ allocation.get('priority').should.equal 'low'
+
+ # Test Scenario 03
+ describe "allocation using reservation for immediate use", ->
+ reservation = undefined
+
+ # TC-05
+ describe "create-reservation", ->
+ it "should create reservation record (no start/end) without error", (done) ->
+ app.access('opnfv-promise').invoke 'create-reservation',
+ capacity:
+ cores: 5
+ ram: 25600
+ addresses: 3
+ instances: 3
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ reservation = id: res.get('reservation-id')
+ done()
+ .catch (err) -> done err
+
+ it "should update promise.reservations with a new entry", ->
+ app.get('opnfv-promise.promise.reservations').length.should.be.above(0)
+
+ it "should contain a new ResourceReservation record in the store", ->
+ assert reservation?.id?, "unable to check without ID"
+ reservation = app.access('opnfv-promise').find('ResourceReservation', reservation.id)
+ assert reservation?
+
+ # TC-06
+ describe "create-instance", ->
+ allocation = undefined
+
+ before ->
+ assert provider?,
+ "unable to execute without registered 'provider'"
+ assert reservation?,
+ "unable to execute without valid reservation record"
+
+ it "should create a new server in target provider (with reservation) without error", (done) ->
+ @timeout 5000
+ test = config.get 'openstack.test'
+ app.access('opnfv-promise').invoke 'create-instance',
+ 'provider-id': provider.id
+ name: 'promise-test-reservation'
+ image: test.image
+ flavor: test.flavor
+ networks: [ test.network ]
+ 'reservation-id': reservation.id
+ .then (res) ->
+ debug res.get()
+ res.get('result').should.equal 'ok'
+ allocation = id: res.get('instance-id')
+ done()
+ .catch (err) -> done err
+
+ it "should contain a new ResourceAllocation record in the store", ->
+ assert allocation?.id?, "unable to check without ID"
+ allocation = app.access('opnfv-promise').find('ResourceAllocation', allocation.id)
+ assert allocation?
+
+ it "should be referenced in the reservation record", ->
+ assert reservation? and allocation?, "unable to check without records"
+ reservation.get('allocations').should.containEql allocation.id
+
+ it "should have high priority state", ->
+ assert allocation?, "unable to check without record"
+ allocation.get('priority').should.equal 'high'
+
+ # Test Scenario 04
+ describe "reservation for future use", ->
+ reservation = undefined
+ start = new Date
+ end = new Date
+ # 7 days in the future
+ start.setTime (start.getTime() + 7*60*60*1000)
+ # 8 days in the future
+ end.setTime (end.getTime() + 8*60*60*1000)
+
+ # TC-07
+ describe "create-reservation", ->
+ it "should create reservation record (for future) without error", (done) ->
+ app.access('opnfv-promise').invoke 'create-reservation',
+ start: start.toJSON()
+ end: end.toJSON()
+ capacity:
+ cores: 1
+ ram: 12800
+ addresses: 1
+ instances: 1
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ reservation = id: res.get('reservation-id')
+ done()
+ .catch (err) -> done err
+
+ it "should update promise.reservations with a new entry", ->
+ app.get('opnfv-promise.promise.reservations').length.should.be.above(0)
+
+ it "should contain a new ResourceReservation record in the store", ->
+ assert reservation?.id?, "unable to check without ID"
+ reservation = app.access('opnfv-promise').find('ResourceReservation', reservation.id)
+ assert reservation?
+
+ # TC-08
+ describe "query-reservation", ->
+ it "should contain newly created future reservation", (done) ->
+ app.access('opnfv-promise').invoke 'query-reservation',
+ window:
+ start: start.toJSON()
+ end: end.toJSON()
+ .then (res) ->
+ res.get('reservations').should.containEql reservation.id
+ done()
+ .catch (err) -> done err
+
+ # TC-09
+ describe "update-reservation", ->
+ it "should modify existing reservation without error", (done) ->
+ app.access('opnfv-promise').invoke 'update-reservation',
+ 'reservation-id': reservation.id
+ capacity:
+ cores: 3
+ ram: 12800
+ addresses: 2
+ instances: 2
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ done()
+ .catch (err) -> done err
+
+ # TC-10
+ describe "cancel-reservation", ->
+ it "should modify existing reservation without error", (done) ->
+ app.access('opnfv-promise').invoke 'cancel-reservation',
+ 'reservation-id': reservation.id
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ done()
+ .catch (err) -> done err
+
+ it "should no longer contain record of the deleted reservation", ->
+ assert reservation?.id?, "unable to check without ID"
+ reservation = app.access('opnfv-promise').find('ResourceReservation', reservation.id)
+ assert not reservation?
+
+ # Test Scenario 05
+ describe "capacity planning", ->
+
+ # TC-11
+ describe "decrease-capacity", ->
+ start = new Date
+ end = new Date
+ # 30 days in the future
+ start.setTime (start.getTime() + 30*60*60*1000)
+ # 45 days in the future
+ end.setTime (end.getTime() + 45*60*60*1000)
+
+ it "should decrease available capacity from a provider in the future", (done) ->
+ app.access('opnfv-promise').invoke 'decrease-capacity',
+ source: provider
+ capacity:
+ cores: 5
+ ram: 17920
+ instances: 5
+ start: start.toJSON()
+ end: end.toJSON()
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ done()
+ .catch (err) -> done err
+
+ # TC-12
+ describe "increase-capacity", ->
+ start = new Date
+ end = new Date
+ # 14 days in the future
+ start.setTime (start.getTime() + 14*60*60*1000)
+ # 21 days in the future
+ end.setTime (end.getTime() + 21*60*60*1000)
+
+ it "should increase available capacity from a provider in the future", (done) ->
+ app.access('opnfv-promise').invoke 'decrease-capacity',
+ source: provider
+ capacity:
+ cores: 1
+ ram: 3584
+ instances: 1
+ start: start.toJSON()
+ end: end.toJSON()
+ .then (res) ->
+ res.get('result').should.equal 'ok'
+ done()
+ .catch (err) -> done err
+
+ # TC-13 (Should improve this TC)
+ describe "query-capacity", ->
+ it "should report available collections and utilizations", (done) ->
+ app.access('opnfv-promise').invoke 'query-capacity',
+ capacity: 'available'
+ .then (res) ->
+ res.get('collections').should.be.Array
+ res.get('collections').length.should.be.above(0)
+ res.get('utilization').should.be.Array
+ res.get('utilization').length.should.be.above(0)
+ done()
+ .catch (err) -> done err
+
+ # Test Scenario 06
+ describe "reservation with conflict", ->
+ # TC-14
+ describe "create-reservation", ->
+ it "should fail to create immediate reservation record with proper error", (done) ->
+ app.access('opnfv-promise').invoke 'create-reservation',
+ capacity:
+ cores: 5
+ ram: 17920
+ instances: 10
+ .then (res) ->
+ res.get('result').should.equal 'conflict'
+ done()
+ .catch (err) -> done err
+
+ it "should fail to create future reservation record with proper error", (done) ->
+ start = new Date
+ # 30 days in the future
+ start.setTime (start.getTime() + 30*60*60*1000)
+
+ app.access('opnfv-promise').invoke 'create-reservation',
+ capacity:
+ cores: 5
+ ram: 17920
+ instances: 10
+ start: start.toJSON()
+ .then (res) ->
+ res.get('result').should.equal 'conflict'
+ done()
+ .catch (err) -> done err
+
+ # Test Scenario 07
+ describe "cleanup test allocations", ->
+ allocations = undefined
+ before ->
+ allocations = app.get('opnfv-promise.promise.allocations')
+ debug provider.get()
+ debug allocations
+ allocations.length.should.be.above(0)
+
+ describe "destroy-instance", ->
+ it "should successfully destroy all allocations", (done) ->
+ @timeout 5000
+ promises = allocations.map (x) ->
+ app.access('opnfv-promise').invoke 'destroy-instance',
+ 'instance-id': x.id
+ promise.all promises
+ .then (res) ->
+ res.forEach (x) ->
+ debug x.get()
+ x.get('result').should.equal 'ok'
+ done()
+ .catch (err) -> done err