/*
* � Copyright IBM Corp. 2014
*
* 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.
*/
package com.ibm.sbt.services.client.smartcloud.bss;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import org.junit.Assert;
import org.junit.Test;
import com.ibm.commons.util.io.json.JsonJavaObject;
import com.ibm.sbt.services.client.base.JsonEntity;
import com.ibm.sbt.services.client.base.datahandlers.EntityList;
/**
* @author mwallace
*
*/
public class ProvisioningLoadTest extends BaseBssTest {
final static public String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
final static public DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
static {
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
@Test
public void testProvisionAdditionalUsers() {
try {
EntityList<JsonEntity> customerList = getCustomerManagementService().getCustomers();
for (JsonEntity customer : customerList) {
String orgName = customer.getJsonObject().getJsonObject("Organization").getAsString("OrgName");
if ("Abe Industrial".equals(orgName)) {
String id = String.valueOf(customer.getJsonObject().getAsLong("Id"));
String customerState = customer.getJsonObject().getAsString("CustomerState");
try {
if ("ACTIVE".equals(customerState)) {
provisionSubscribers(id, 10, true);
}
} catch (Exception e) {
System.err.println("Provisioning additional users failed because: "+e.getMessage());
}
}
}
} catch (Exception e) {
e.printStackTrace();
Assert.fail("Provisioning additional users failed because: "+e.getMessage());
}
}
@Test
public void testProvisionUsersAlt() {
provisionSubscribersAlt(100);
}
@Test
public void testProvisionUsers() {
provisionSubscribers(100, false);
}
@Test
public void testProvisionUsersSingleSubscriptionLongRun() {
this.assertFail = false;
for (int i=0; i<20; i++) {
try {
provisionSubscribers(500, true);
} catch (Exception e) {
}
// wait the specified interval
try {
Thread.sleep(1800000);
} catch (InterruptedException ie) {}
}
}
@Test
public void testProvisionUsersSingleSubscription() {
try {
// Create customer
String customerId = registerCustomer();
System.out.println("Customer Id : "+customerId);
this.customerId = null;
long begin = System.currentTimeMillis();
for (int i=0; i<500; i++) {
try {
// Add Subscriber
long startAdd = System.currentTimeMillis();
String subscriberId = addSubscriber(customerId);
long durationAdd = System.currentTimeMillis() - startAdd;
// Activate the subscriber
long startActivate = System.currentTimeMillis();
activateSubscriber(subscriberId);
long durationActivate = System.currentTimeMillis() - startActivate;
// Create "IBM SmartCloud Connections" Subscription
long startCreateSub = System.currentTimeMillis();
String engageSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 1);
long durationCreateSub = System.currentTimeMillis() - startCreateSub;
// Entitle subscriber
long startEntitleSub = System.currentTimeMillis();
entitleSubscriber(subscriberId, engageSubscriptionId, true);
long durationEntitleSub = System.currentTimeMillis() - startEntitleSub;
System.out.println(i+1 + ", " + subscriberId + ", " + durationAdd + ", " + durationActivate + ", " + durationCreateSub + ", " + durationEntitleSub);
//entitleSubscriber(subscriberId, storageSubscriptionId, true);
} catch (Exception e) {
}
}
long totalDuration = System.currentTimeMillis() - begin;
System.out.println("Total duration: "+totalDuration+"(ms)");
} catch (Exception e) {
e.printStackTrace();
Assert.fail("Error provisioning 100 users caused by: "+e.getMessage());
}
}
@Test
public void testReprovisionUsers() {
try {
// Create customer
String customerId = registerCustomer();
// Create "IBM SmartCloud Connections" Subscription
String engageSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 100);
//System.out.println(engageSubscriptionId);
System.out.println("D0NWLLL : " + getSubscriptionById(engageSubscriptionId).toJsonString());
// Create Extra Storage Subscription
String storageSubscriptionId = createSubscription(customerId, 3, "D100PLL", 100);
//System.out.println(storageSubscriptionId);
System.out.println("D100PLL : " + getSubscriptionById(storageSubscriptionId).toJsonString());
String prefix = "ibmsbt" + System.currentTimeMillis() + "_";
List<String> subscriberIds = new ArrayList<String>();
for (int i=0; i<10; i++) {
// Add Subscriber
String email = prefix + i + "@ivthouse.com";
String subscriberId = addSubscriber(customerId, email);
subscriberIds.add(subscriberId);
// Activate the subscriber
activateSubscriber(subscriberId);
// Entitle subscriber
long start = System.currentTimeMillis();
entitleSubscriber(subscriberId, engageSubscriptionId, true);
long duration = System.currentTimeMillis() - start;
System.out.println(i+1 + ", " + subscriberId + ", " + duration);
//entitleSubscriber(subscriberId, storageSubscriptionId, true);
}
for (String subscriberId : subscriberIds) {
getSubscriberManagementService().deleteSubscriber(subscriberId);
}
System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------");
for (int i=0; i<10; i++) {
// Add Subscriber
String email = prefix + i + "@ivthouse.com";
String subscriberId = addSubscriber(customerId, email);
subscriberIds.add(subscriberId);
// Activate the subscriber
activateSubscriber(subscriberId);
// Entitle subscriber
long start = System.currentTimeMillis();
entitleSubscriber(subscriberId, engageSubscriptionId, true);
long duration = System.currentTimeMillis() - start;
System.out.println(i+1 + ", " + subscriberId + ", " + duration);
//entitleSubscriber(subscriberId, storageSubscriptionId, true);
}
} catch (Exception e) {
e.printStackTrace();
Assert.fail("Error provisioning 100 users caused by: "+e.getMessage());
}
}
@Test
public void testProvisionUsersLongRun() {
this.assertFail = false;
for (int i=0; i<20; i++) {
try {
provisionSubscribers(100, false);
} catch (Exception e) {
}
// wait the specified interval
try {
Thread.sleep(1800000);
} catch (InterruptedException ie) {}
}
}
@Test
public void testProvisionUsersAltLongRun() {
this.assertFail = false;
for (int i=0; i<20; i++) {
try {
provisionSubscribersAlt(100);
} catch (Exception e) {
}
// wait the specified interval
try {
Thread.sleep(1800000);
} catch (InterruptedException ie) {}
}
}
private void provisionSubscribers(int count, boolean singleSubscription) {
try {
// Create customer
String customerId = registerCustomer();
// Provision subscribers
provisionSubscribers(customerId, count, singleSubscription);
} catch (Exception e) {
e.printStackTrace();
}
}
private void provisionSubscribers(String customerId, int count, boolean singleSubscription) {
try {
// Create "IBM SmartCloud Connections" Subscription
String engageSubscriptionId = null;
if (!singleSubscription) {
engageSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 100);
}
System.out.println("Customer Id:" + customerId);
System.out.println("Time, Subscriber Id, Add Subscriber, Activate Subscriber, Set password, Create Subscription, Entitle Subscriber, Entitle Subscriber, Revoke Subscription, Cancel Subscription");
for (int i=0; i<count; i++) {
try {
// Add Subscriber
long start1 = System.currentTimeMillis();
String subscriberId = addSubscriber(customerId);
long duration1 = System.currentTimeMillis() - start1;
JsonEntity subscriber = getSubscriberById(subscriberId);
String loginName = subscriber.getAsString("Subscriber/Person/EmailAddress");
// Activate the subscriber
long start2 = System.currentTimeMillis();
activateSubscriber(subscriberId);
long duration2 = System.currentTimeMillis() - start2;
// Set password
long start3 = System.currentTimeMillis();
setPassword(loginName, "onet1me!", "passw0rd");
long duration3 = System.currentTimeMillis() - start3;
// Create temp
long start4 = System.currentTimeMillis();
String tempSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 1);
long duration4 = System.currentTimeMillis() - start4;
// Entitle temp
long start5 = System.currentTimeMillis();
entitleSubscriber(subscriberId, tempSubscriptionId, true);
long duration5 = System.currentTimeMillis() - start5;
// Entitle subscriber
long start6 = System.currentTimeMillis();
if (singleSubscription) {
engageSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 1);
}
long duration6 = System.currentTimeMillis() - start6;
long start7 = System.currentTimeMillis();
entitleSubscriber(subscriberId, engageSubscriptionId, true);
long duration7 = System.currentTimeMillis() - start7;
// Revoke temp
long start8 = System.currentTimeMillis();
JsonJavaObject seatJson = findSeat(subscriberId, tempSubscriptionId);
String seatId = String.valueOf(seatJson.getAsObject("Seat").getAsLong("Id"));
revokeSubscriber(subscriberId, seatId, true);
long duration8 = System.currentTimeMillis() - start8;
// Cancel temp
long start9 = System.currentTimeMillis();
cancelSubscription(tempSubscriptionId);
long duration9 = System.currentTimeMillis() - start9;
System.out.println(dateFormat.format(new Date(start1)) +
", " + subscriberId +
", " + duration1 +
", " + duration2 +
", " + duration3 +
", " + duration4 +
", " + duration5 +
", " + duration6 +
", " + duration7 +
", " + duration8 +
", " + duration9);
} catch (Exception e) {
}
}
System.out.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
private void provisionSubscribersAlt(int count) {
try {
// Create customer
String customerId = registerCustomer();
// Provision subscribers
provisionSubscribersAlt(customerId, count);
} catch (Exception e) {
e.printStackTrace();
}
}
private void provisionSubscribersAlt(String customerId, int count) {
try {
// Create "IBM SmartCloud Connections" Subscription
String engageSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 100);
List<UserProvisionJob> provisionJobs = new ArrayList<UserProvisionJob>();
for (int i=0; i<count; i++) {
try {
provisionJobs.add(new UserProvisionJob(engageSubscriptionId));
System.out.print(".");
} catch (Exception e) {
}
}
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.entitlePoolSubscription();
System.out.print(".");
} catch (Exception e) {
}
}
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.waitPoolSubscription();
System.out.print(".");
} catch (Exception e) {
}
}
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.entitleEngageSubscription();
System.out.print(".");
} catch (Exception e) {
}
}
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.waitEngageSubscription();
System.out.print(".");
} catch (Exception e) {
}
}
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.revokePoolSubscription();
System.out.print(".");
} catch (Exception e) {
}
}
System.out.println("Customer Id:" + customerId);
System.out.println("Time, Subscriber Id, Add Subscriber, Activate Subscriber, Set password, Create Subscription, Entitle Subscriber, Entitle Subscriber, Revoke Subscription, Cancel Subscription");
for (UserProvisionJob provisionJob : provisionJobs) {
try {
provisionJob.dumpDurations();
} catch (Exception e) {
}
}
System.out.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
private class UserProvisionJob {
private String engageSubscriptionId;
private String subscriberId;
private String loginName;
private String tempSubscriptionId;
private long start = System.currentTimeMillis();
private long duration1;
private long duration2;
private long duration3;
private long duration4;
private long duration5;
private long duration6;
private long duration7;
private long duration8;
private long duration9;
UserProvisionJob(String engageSubscriptionId) {
this.engageSubscriptionId = engageSubscriptionId;
// Add Subscriber
long start = System.currentTimeMillis();
subscriberId = addSubscriber(customerId);
duration1 = System.currentTimeMillis() - start;
JsonEntity subscriber = getSubscriberById(subscriberId);
loginName = subscriber.getAsString("Subscriber/Person/EmailAddress");
// Activate the subscriber
long start2 = System.currentTimeMillis();
activateSubscriber(subscriberId);
duration2 = System.currentTimeMillis() - start2;
// Set password
long start3 = System.currentTimeMillis();
setPassword(loginName, "onet1me!", "passw0rd");
duration3 = System.currentTimeMillis() - start3;
// Create temp
long start4 = System.currentTimeMillis();
tempSubscriptionId = createSubscription(customerId, 3, "D0NWLLL", 1);
duration4 = System.currentTimeMillis() - start4;
}
void entitlePoolSubscription() throws BssException {
// Entitle temp
long start5 = System.currentTimeMillis();
entitleSubscriber(subscriberId, tempSubscriptionId, true, false);
duration5 = System.currentTimeMillis() - start5;
}
void waitPoolSubscription() throws BssException {
getSubscriberManagementService().waitSeatState(subscriberId, tempSubscriptionId, "ASSIGNED", 10, 2000, null);
}
void entitleEngageSubscription() throws BssException {
long start6 = System.currentTimeMillis();
entitleSubscriber(subscriberId, engageSubscriptionId, true, false);
duration6 = System.currentTimeMillis() - start6;
}
void waitEngageSubscription() throws BssException {
getSubscriberManagementService().waitSeatState(subscriberId, engageSubscriptionId, "ASSIGNED", 10, 2000, null);
}
void revokePoolSubscription() throws BssException {
// Revoke temp
long start7 = System.currentTimeMillis();
JsonJavaObject seatJson = findSeat(subscriberId, tempSubscriptionId);
String seatId = String.valueOf(seatJson.getAsObject("Seat").getAsLong("Id"));
revokeSubscriber(subscriberId, seatId, true);
duration7 = System.currentTimeMillis() - start7;
// Cancel temp
long start8 = System.currentTimeMillis();
cancelSubscription(tempSubscriptionId);
duration8 = System.currentTimeMillis() - start8;
}
void dumpDurations() {
System.out.println(dateFormat.format(new Date(start)) +
", " + subscriberId +
", " + duration1 +
", " + duration2 +
", " + duration3 +
", " + duration4 +
", " + duration5 +
", " + duration6 +
", " + duration7 +
", " + duration8);
}
}
}