string unitPrice;
string startTime;
string endTime;
- string ellapsedTime;
+ string elapsedTime;
+ string units;
string credits;
}
string resourceType;
string unitName;
string totalCredits;
+ string totalElapsedTime;
+ string totalUnits;
array<EventEntryMsg> details;
}
+ record ServiceEntryMsg {
+ string serviceName;
+ string totalCredits;
+ string totalElapsedTime;
+ string totalUnits;
+ string unitName;
+ array<ResourceEntryMsg> details;
+ }
+
record BillEntryMsg {
string id;
string userID;
string status;
string remainingCredits;
string deductedCredits;
- string startTime; // what is this? millis? date?
+ string startTime;
string endTime;
- array<ResourceEntryMsg> bill;
+ array<ServiceEntryMsg> bill;
}
}
\ No newline at end of file
@SuppressWarnings("all")
public interface AquariumBill {
- public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"AquariumBill\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"types\":[{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]},{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ChargeEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"EventEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":\"ResourceEntryMsg\"}}]}],\"messages\":{}}");
+ public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"AquariumBill\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"types\":[{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]},{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ChargeEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"EventEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ServiceEntryMsg\",\"fields\":[{\"name\":\"serviceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ResourceEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":\"ServiceEntryMsg\"}}]}],\"messages\":{}}");
@SuppressWarnings("all")
public interface Callback extends AquariumBill {
package gr.grnet.aquarium.message.avro.gen;
@SuppressWarnings("all")
public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
- public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}}}]}");
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ServiceEntryMsg\",\"fields\":[{\"name\":\"serviceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}}}]}}}]}");
@Deprecated public java.lang.String id;
@Deprecated public java.lang.String userID;
@Deprecated public java.lang.String status;
@Deprecated public java.lang.String deductedCredits;
@Deprecated public java.lang.String startTime;
@Deprecated public java.lang.String endTime;
- @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> bill;
+ @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> bill;
public org.apache.avro.Schema getSchema() { return SCHEMA$; }
// Used by DatumWriter. Applications should not call.
public java.lang.Object get(int field$) {
case 4: deductedCredits = (java.lang.String)value$; break;
case 5: startTime = (java.lang.String)value$; break;
case 6: endTime = (java.lang.String)value$; break;
- case 7: bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>)value$; break;
+ case 7: bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>)value$; break;
default: throw new org.apache.avro.AvroRuntimeException("Bad index");
}
}
/**
* Gets the value of the 'bill' field.
*/
- public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> getBill() {
+ public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> getBill() {
return bill;
}
* Sets the value of the 'bill' field.
* @param value the value to set.
*/
- public void setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> value) {
+ public void setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> value) {
this.bill = value;
}
private java.lang.String deductedCredits;
private java.lang.String startTime;
private java.lang.String endTime;
- private java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> bill;
+ private java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> bill;
/** Creates a new Builder */
private Builder() {
fieldSetFlags()[6] = true;
}
if (isValidValue(fields()[7], other.bill)) {
- this.bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>) data().deepCopy(fields()[7].schema(), other.bill);
+ this.bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>) data().deepCopy(fields()[7].schema(), other.bill);
fieldSetFlags()[7] = true;
}
}
}
/** Gets the value of the 'bill' field */
- public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> getBill() {
+ public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> getBill() {
return bill;
}
/** Sets the value of the 'bill' field */
- public gr.grnet.aquarium.message.avro.gen.BillEntryMsg.Builder setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> value) {
+ public gr.grnet.aquarium.message.avro.gen.BillEntryMsg.Builder setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> value) {
validate(fields()[7], value);
this.bill = value;
fieldSetFlags()[7] = true;
record.deductedCredits = fieldSetFlags()[4] ? this.deductedCredits : (java.lang.String) defaultValue(fields()[4]);
record.startTime = fieldSetFlags()[5] ? this.startTime : (java.lang.String) defaultValue(fields()[5]);
record.endTime = fieldSetFlags()[6] ? this.endTime : (java.lang.String) defaultValue(fields()[6]);
- record.bill = fieldSetFlags()[7] ? this.bill : (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>) defaultValue(fields()[7]);
+ record.bill = fieldSetFlags()[7] ? this.bill : (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>) defaultValue(fields()[7]);
return record;
} catch (Exception e) {
throw new org.apache.avro.AvroRuntimeException(e);
package gr.grnet.aquarium.message.avro.gen;
@SuppressWarnings("all")
public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
- public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");
@Deprecated public java.lang.String id;
@Deprecated public java.lang.String unitPrice;
@Deprecated public java.lang.String startTime;
@Deprecated public java.lang.String endTime;
- @Deprecated public java.lang.String ellapsedTime;
+ @Deprecated public java.lang.String elapsedTime;
+ @Deprecated public java.lang.String units;
@Deprecated public java.lang.String credits;
public org.apache.avro.Schema getSchema() { return SCHEMA$; }
// Used by DatumWriter. Applications should not call.
case 1: return unitPrice;
case 2: return startTime;
case 3: return endTime;
- case 4: return ellapsedTime;
- case 5: return credits;
+ case 4: return elapsedTime;
+ case 5: return units;
+ case 6: return credits;
default: throw new org.apache.avro.AvroRuntimeException("Bad index");
}
}
case 1: unitPrice = (java.lang.String)value$; break;
case 2: startTime = (java.lang.String)value$; break;
case 3: endTime = (java.lang.String)value$; break;
- case 4: ellapsedTime = (java.lang.String)value$; break;
- case 5: credits = (java.lang.String)value$; break;
+ case 4: elapsedTime = (java.lang.String)value$; break;
+ case 5: units = (java.lang.String)value$; break;
+ case 6: credits = (java.lang.String)value$; break;
default: throw new org.apache.avro.AvroRuntimeException("Bad index");
}
}
}
/**
- * Gets the value of the 'ellapsedTime' field.
+ * Gets the value of the 'elapsedTime' field.
*/
- public java.lang.String getEllapsedTime() {
- return ellapsedTime;
+ public java.lang.String getElapsedTime() {
+ return elapsedTime;
}
/**
- * Sets the value of the 'ellapsedTime' field.
+ * Sets the value of the 'elapsedTime' field.
* @param value the value to set.
*/
- public void setEllapsedTime(java.lang.String value) {
- this.ellapsedTime = value;
+ public void setElapsedTime(java.lang.String value) {
+ this.elapsedTime = value;
+ }
+
+ /**
+ * Gets the value of the 'units' field.
+ */
+ public java.lang.String getUnits() {
+ return units;
+ }
+
+ /**
+ * Sets the value of the 'units' field.
+ * @param value the value to set.
+ */
+ public void setUnits(java.lang.String value) {
+ this.units = value;
}
/**
private java.lang.String unitPrice;
private java.lang.String startTime;
private java.lang.String endTime;
- private java.lang.String ellapsedTime;
+ private java.lang.String elapsedTime;
+ private java.lang.String units;
private java.lang.String credits;
/** Creates a new Builder */
this.endTime = (java.lang.String) data().deepCopy(fields()[3].schema(), other.endTime);
fieldSetFlags()[3] = true;
}
- if (isValidValue(fields()[4], other.ellapsedTime)) {
- this.ellapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.ellapsedTime);
+ if (isValidValue(fields()[4], other.elapsedTime)) {
+ this.elapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.elapsedTime);
fieldSetFlags()[4] = true;
}
- if (isValidValue(fields()[5], other.credits)) {
- this.credits = (java.lang.String) data().deepCopy(fields()[5].schema(), other.credits);
+ if (isValidValue(fields()[5], other.units)) {
+ this.units = (java.lang.String) data().deepCopy(fields()[5].schema(), other.units);
fieldSetFlags()[5] = true;
}
+ if (isValidValue(fields()[6], other.credits)) {
+ this.credits = (java.lang.String) data().deepCopy(fields()[6].schema(), other.credits);
+ fieldSetFlags()[6] = true;
+ }
}
/** Gets the value of the 'id' field */
return this;
}
- /** Gets the value of the 'ellapsedTime' field */
- public java.lang.String getEllapsedTime() {
- return ellapsedTime;
+ /** Gets the value of the 'elapsedTime' field */
+ public java.lang.String getElapsedTime() {
+ return elapsedTime;
}
- /** Sets the value of the 'ellapsedTime' field */
- public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setEllapsedTime(java.lang.String value) {
+ /** Sets the value of the 'elapsedTime' field */
+ public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setElapsedTime(java.lang.String value) {
validate(fields()[4], value);
- this.ellapsedTime = value;
+ this.elapsedTime = value;
fieldSetFlags()[4] = true;
return this;
}
- /** Checks whether the 'ellapsedTime' field has been set */
- public boolean hasEllapsedTime() {
+ /** Checks whether the 'elapsedTime' field has been set */
+ public boolean hasElapsedTime() {
return fieldSetFlags()[4];
}
- /** Clears the value of the 'ellapsedTime' field */
- public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearEllapsedTime() {
- ellapsedTime = null;
+ /** Clears the value of the 'elapsedTime' field */
+ public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearElapsedTime() {
+ elapsedTime = null;
fieldSetFlags()[4] = false;
return this;
}
+ /** Gets the value of the 'units' field */
+ public java.lang.String getUnits() {
+ return units;
+ }
+
+ /** Sets the value of the 'units' field */
+ public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setUnits(java.lang.String value) {
+ validate(fields()[5], value);
+ this.units = value;
+ fieldSetFlags()[5] = true;
+ return this;
+ }
+
+ /** Checks whether the 'units' field has been set */
+ public boolean hasUnits() {
+ return fieldSetFlags()[5];
+ }
+
+ /** Clears the value of the 'units' field */
+ public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearUnits() {
+ units = null;
+ fieldSetFlags()[5] = false;
+ return this;
+ }
+
/** Gets the value of the 'credits' field */
public java.lang.String getCredits() {
return credits;
/** Sets the value of the 'credits' field */
public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setCredits(java.lang.String value) {
- validate(fields()[5], value);
+ validate(fields()[6], value);
this.credits = value;
- fieldSetFlags()[5] = true;
+ fieldSetFlags()[6] = true;
return this;
}
/** Checks whether the 'credits' field has been set */
public boolean hasCredits() {
- return fieldSetFlags()[5];
+ return fieldSetFlags()[6];
}
/** Clears the value of the 'credits' field */
public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearCredits() {
credits = null;
- fieldSetFlags()[5] = false;
+ fieldSetFlags()[6] = false;
return this;
}
record.unitPrice = fieldSetFlags()[1] ? this.unitPrice : (java.lang.String) defaultValue(fields()[1]);
record.startTime = fieldSetFlags()[2] ? this.startTime : (java.lang.String) defaultValue(fields()[2]);
record.endTime = fieldSetFlags()[3] ? this.endTime : (java.lang.String) defaultValue(fields()[3]);
- record.ellapsedTime = fieldSetFlags()[4] ? this.ellapsedTime : (java.lang.String) defaultValue(fields()[4]);
- record.credits = fieldSetFlags()[5] ? this.credits : (java.lang.String) defaultValue(fields()[5]);
+ record.elapsedTime = fieldSetFlags()[4] ? this.elapsedTime : (java.lang.String) defaultValue(fields()[4]);
+ record.units = fieldSetFlags()[5] ? this.units : (java.lang.String) defaultValue(fields()[5]);
+ record.credits = fieldSetFlags()[6] ? this.credits : (java.lang.String) defaultValue(fields()[6]);
return record;
} catch (Exception e) {
throw new org.apache.avro.AvroRuntimeException(e);
package gr.grnet.aquarium.message.avro.gen;
@SuppressWarnings("all")
public class EventEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
- public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}");
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}");
@Deprecated public java.lang.String eventType;
@Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg> details;
public org.apache.avro.Schema getSchema() { return SCHEMA$; }
package gr.grnet.aquarium.message.avro.gen;
@SuppressWarnings("all")
public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
- public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}");
+ public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}");
@Deprecated public java.lang.String resourceName;
@Deprecated public java.lang.String resourceType;
@Deprecated public java.lang.String unitName;
@Deprecated public java.lang.String totalCredits;
+ @Deprecated public java.lang.String totalElapsedTime;
+ @Deprecated public java.lang.String totalUnits;
@Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> details;
public org.apache.avro.Schema getSchema() { return SCHEMA$; }
// Used by DatumWriter. Applications should not call.
case 1: return resourceType;
case 2: return unitName;
case 3: return totalCredits;
- case 4: return details;
+ case 4: return totalElapsedTime;
+ case 5: return totalUnits;
+ case 6: return details;
default: throw new org.apache.avro.AvroRuntimeException("Bad index");
}
}
case 1: resourceType = (java.lang.String)value$; break;
case 2: unitName = (java.lang.String)value$; break;
case 3: totalCredits = (java.lang.String)value$; break;
- case 4: details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>)value$; break;
+ case 4: totalElapsedTime = (java.lang.String)value$; break;
+ case 5: totalUnits = (java.lang.String)value$; break;
+ case 6: details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>)value$; break;
default: throw new org.apache.avro.AvroRuntimeException("Bad index");
}
}
}
/**
+ * Gets the value of the 'totalElapsedTime' field.
+ */
+ public java.lang.String getTotalElapsedTime() {
+ return totalElapsedTime;
+ }
+
+ /**
+ * Sets the value of the 'totalElapsedTime' field.
+ * @param value the value to set.
+ */
+ public void setTotalElapsedTime(java.lang.String value) {
+ this.totalElapsedTime = value;
+ }
+
+ /**
+ * Gets the value of the 'totalUnits' field.
+ */
+ public java.lang.String getTotalUnits() {
+ return totalUnits;
+ }
+
+ /**
+ * Sets the value of the 'totalUnits' field.
+ * @param value the value to set.
+ */
+ public void setTotalUnits(java.lang.String value) {
+ this.totalUnits = value;
+ }
+
+ /**
* Gets the value of the 'details' field.
*/
public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> getDetails() {
private java.lang.String resourceType;
private java.lang.String unitName;
private java.lang.String totalCredits;
+ private java.lang.String totalElapsedTime;
+ private java.lang.String totalUnits;
private java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> details;
/** Creates a new Builder */
this.totalCredits = (java.lang.String) data().deepCopy(fields()[3].schema(), other.totalCredits);
fieldSetFlags()[3] = true;
}
- if (isValidValue(fields()[4], other.details)) {
- this.details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) data().deepCopy(fields()[4].schema(), other.details);
+ if (isValidValue(fields()[4], other.totalElapsedTime)) {
+ this.totalElapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.totalElapsedTime);
fieldSetFlags()[4] = true;
}
+ if (isValidValue(fields()[5], other.totalUnits)) {
+ this.totalUnits = (java.lang.String) data().deepCopy(fields()[5].schema(), other.totalUnits);
+ fieldSetFlags()[5] = true;
+ }
+ if (isValidValue(fields()[6], other.details)) {
+ this.details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) data().deepCopy(fields()[6].schema(), other.details);
+ fieldSetFlags()[6] = true;
+ }
}
/** Gets the value of the 'resourceName' field */
return this;
}
+ /** Gets the value of the 'totalElapsedTime' field */
+ public java.lang.String getTotalElapsedTime() {
+ return totalElapsedTime;
+ }
+
+ /** Sets the value of the 'totalElapsedTime' field */
+ public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setTotalElapsedTime(java.lang.String value) {
+ validate(fields()[4], value);
+ this.totalElapsedTime = value;
+ fieldSetFlags()[4] = true;
+ return this;
+ }
+
+ /** Checks whether the 'totalElapsedTime' field has been set */
+ public boolean hasTotalElapsedTime() {
+ return fieldSetFlags()[4];
+ }
+
+ /** Clears the value of the 'totalElapsedTime' field */
+ public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearTotalElapsedTime() {
+ totalElapsedTime = null;
+ fieldSetFlags()[4] = false;
+ return this;
+ }
+
+ /** Gets the value of the 'totalUnits' field */
+ public java.lang.String getTotalUnits() {
+ return totalUnits;
+ }
+
+ /** Sets the value of the 'totalUnits' field */
+ public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setTotalUnits(java.lang.String value) {
+ validate(fields()[5], value);
+ this.totalUnits = value;
+ fieldSetFlags()[5] = true;
+ return this;
+ }
+
+ /** Checks whether the 'totalUnits' field has been set */
+ public boolean hasTotalUnits() {
+ return fieldSetFlags()[5];
+ }
+
+ /** Clears the value of the 'totalUnits' field */
+ public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearTotalUnits() {
+ totalUnits = null;
+ fieldSetFlags()[5] = false;
+ return this;
+ }
+
/** Gets the value of the 'details' field */
public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> getDetails() {
return details;
/** Sets the value of the 'details' field */
public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setDetails(java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> value) {
- validate(fields()[4], value);
+ validate(fields()[6], value);
this.details = value;
- fieldSetFlags()[4] = true;
+ fieldSetFlags()[6] = true;
return this;
}
/** Checks whether the 'details' field has been set */
public boolean hasDetails() {
- return fieldSetFlags()[4];
+ return fieldSetFlags()[6];
}
/** Clears the value of the 'details' field */
public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearDetails() {
details = null;
- fieldSetFlags()[4] = false;
+ fieldSetFlags()[6] = false;
return this;
}
record.resourceType = fieldSetFlags()[1] ? this.resourceType : (java.lang.String) defaultValue(fields()[1]);
record.unitName = fieldSetFlags()[2] ? this.unitName : (java.lang.String) defaultValue(fields()[2]);
record.totalCredits = fieldSetFlags()[3] ? this.totalCredits : (java.lang.String) defaultValue(fields()[3]);
- record.details = fieldSetFlags()[4] ? this.details : (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) defaultValue(fields()[4]);
+ record.totalElapsedTime = fieldSetFlags()[4] ? this.totalElapsedTime : (java.lang.String) defaultValue(fields()[4]);
+ record.totalUnits = fieldSetFlags()[5] ? this.totalUnits : (java.lang.String) defaultValue(fields()[5]);
+ record.details = fieldSetFlags()[6] ? this.details : (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) defaultValue(fields()[6]);
return record;
} catch (Exception e) {
throw new org.apache.avro.AvroRuntimeException(e);
import gr.grnet.aquarium.AquariumInternalError
import gr.grnet.aquarium.charging.bill.{AbstractBillEntry, BillEntry}
+import gr.grnet.aquarium.message.avro.gen.BillEntryMsg
+import gr.grnet.aquarium.converter.{PrettyJsonTextFormat, StdConverters}
+import gr.grnet.aquarium.message.avro.AvroHelpers
/**
*
case Right(data) ⇒
data.userID
}
+
+ override def responseToJsonString = {
+ response.fold(
+ _ ⇒ "", // No JSON response on error
+ data ⇒ AvroHelpers.jsonStringOfSpecificRecord(data)
+ )
+ }
}
-case class GetUserBillResponseData(userID: String, billEntry: AbstractBillEntry)
\ No newline at end of file
+case class GetUserBillResponseData(userID: String, billEntry: BillEntryMsg)
\ No newline at end of file
import gr.grnet.aquarium.actor.message.GetUserWalletResponseData
import gr.grnet.aquarium.actor.message.config.AquariumPropertiesLoaded
import gr.grnet.aquarium.actor.message.config.InitializeUserActorState
-import gr.grnet.aquarium.charging.bill.AbstractBillEntry
+import gr.grnet.aquarium.charging.bill.{BillEntry, AbstractBillEntry}
import gr.grnet.aquarium.charging.state.{UserStateModel, UserAgreementHistoryModel, UserStateBootstrap}
import gr.grnet.aquarium.computation.BillingMonthInfo
import gr.grnet.aquarium.message.avro.gen.{IMEventMsg, ResourceEventMsg, UserStateMsg}
case Some(policy:PolicyModel) => policy.resourceTypesMap
}
val state= if(haveUserState) Some(this._userState.msg) else None
- val billEntry = AbstractBillEntry.fromWorkingUserState(timeslot,this._userID,state,resourceTypes)
- val billData = GetUserBillResponseData(this._userID,billEntry)
+ val billEntryMsg = BillEntry.fromWorkingUserState(timeslot,this._userID,state,resourceTypes)
+ //val billEntryMsg = MessageFactory.createBillEntryMsg(billEntry)
+ //logger.debug("BILL ENTRY MSG: " + billEntryMsg.toString)
+ val billData = GetUserBillResponseData(this._userID,billEntryMsg)
sender ! GetUserBillResponse(Right(billData))
} catch {
case e:Exception =>
import com.ckkloverdos.props.Props
import com.ckkloverdos.resource.FileStreamResource
-import gr.grnet.aquarium.converter.{CompactJsonTextFormat, StdConverters}
+import gr.grnet.aquarium.converter.StdConverters
import gr.grnet.aquarium.logic.accounting.dsl.Timeslot
import gr.grnet.aquarium.message.avro.{AvroHelpers, MessageHelpers}
-import gr.grnet.aquarium.message.avro.gen.{ChargeslotMsg, WalletEntryMsg, UserStateMsg}
-import gr.grnet.aquarium.store.memory.MemStoreProvider
+import gr.grnet.aquarium.message.avro.gen._
import gr.grnet.aquarium.util.json.JsonSupport
import gr.grnet.aquarium.{Aquarium, ResourceLocator, AquariumBuilder}
import java.io.File
import java.util.concurrent.atomic.AtomicLong
import scala.collection.immutable.TreeMap
import scala.collection.mutable.ListBuffer
+import scala.Some
import gr.grnet.aquarium.policy.ResourceType
+import java.util
/*
case class ResourceEntry(val resourceName : String,
- //val resourceType : String,
- //val unitName : String,
+ val resourceType : String,
+ val unitName : String,
val totalCredits : String,
val totalElapsedTime : String,
val totalUnits : String,
val details : List[EventEntry])
extends JsonSupport {
- var unitName = "EMPTY_UNIT_NAME"
- var resourceType = "EMPTY_RESOURCE_TYPE"
+ //var unitName = "EMPTY_UNIT_NAME"
+ //var resourceType = "EMPTY_RESOURCE_TYPE"
}
case class ServiceEntry(val serviceName: String,
)
extends JsonSupport {}
-abstract class AbstractBillEntry
- extends JsonSupport {}
class BillEntry(val id:String,
val userID : String,
val endTime:String,
val bill:List[ServiceEntry]
)
- extends AbstractBillEntry {}
+ extends JsonSupport {}
-object AbstractBillEntry {
+object BillEntry {
private[this] val counter = new AtomicLong(0L)
private[this] def nextUIDObject() = counter.getAndIncrement
val dend = cal.getTime
Timeslot(dstart,dend)
} */
+ private [this] def newChargeEntry(id:String,
+ unitPrice:String,
+ startTime:String,
+ endTime:String,
+ elapsedTime:String,
+ units:String,
+ credits:String) : ChargeEntryMsg = {
+ val msg = new ChargeEntryMsg
+ msg.setId(id)
+ msg.setUnitPrice(unitPrice)
+ msg.setStartTime(startTime)
+ msg.setEndTime(endTime)
+ msg.setElapsedTime(elapsedTime)
+ msg.setUnits(units)
+ msg.setCredits(credits)
+ msg
+ }
+
+ private[this] def newEventEntry(eventType : String,
+ details : java.util.List[ChargeEntryMsg]) : EventEntryMsg = {
+
+ val msg = new EventEntryMsg
+ msg.setEventType(eventType)
+ msg.setDetails(details)
+ msg
+ }
+
+ private [this] def newResourceEntry( resourceName : String,
+ resourceType : String,
+ unitName : String,
+ totalCredits : String,
+ totalElapsedTime : String,
+ totalUnits : String,
+ details : java.util.List[EventEntryMsg]) : ResourceEntryMsg = {
+ val msg = new ResourceEntryMsg
+ msg.setResourceName(resourceName)
+ msg.setResourceType(resourceType)
+ msg.setUnitName(unitName)
+ msg.setTotalCredits(totalCredits)
+ msg.setTotalElapsedTime(totalElapsedTime)
+ msg.setTotalUnits(totalUnits)
+ msg.setDetails(details)
+ msg
+ }
- private[this] def toChargeEntry(c:ChargeslotMsg) : (ChargeEntry,Long,Double) = {
+ private[this] def newServiceEntry( serviceName: String,
+ totalCredits : String,
+ totalElapsedTime : String,
+ totalUnits:String,
+ unitName:String,
+ details: java.util.List[ResourceEntryMsg]
+ ) : ServiceEntryMsg = {
+ val msg = new ServiceEntryMsg
+ msg.setServiceName(serviceName)
+ msg.setTotalCredits(totalCredits)
+ msg.setTotalElapsedTime(totalElapsedTime)
+ msg.setTotalUnits(totalUnits)
+ msg.setUnitName(unitName)
+ msg.setDetails(details)
+ msg
+ }
+
+
+ private[this] def newBillEntry( id:String,
+ userID : String,
+ status : String,
+ remainingCredits:String,
+ deductedCredits:String,
+ startTime:String,
+ endTime:String,
+ bill: java.util.List[ServiceEntryMsg]
+ ) : BillEntryMsg = {
+ val msg = new BillEntryMsg
+ msg.setId(id)
+ msg.setUserID(userID)
+ msg.setStatus(status)
+ msg.setRemainingCredits(remainingCredits)
+ msg.setDeductedCredits(deductedCredits)
+ msg.setStartTime(startTime)
+ msg.setEndTime(endTime)
+ msg.setBill(bill)
+ msg
+ }
+
+ private[this] def javaList[A](l:A*) : java.util.List[A] = {
+ val al = new java.util.ArrayList[A]()
+ l.foreach(al.add(_))
+ al
+ }
+
+
+ private[this] def toChargeEntry(c:ChargeslotMsg) : (ChargeEntryMsg,Long,Double) = {
val unitPrice = c.getUnitPrice.toString
val startTime = c.getStartMillis.toString
val endTime = c.getStopMillis.toString
val difTime = (c.getStopMillis - c.getStartMillis).toLong
val unitsD = (c.getCreditsToSubtract/c.getUnitPrice)
val credits = c.getCreditsToSubtract.toString
- (new ChargeEntry(counter.getAndIncrement.toString,unitPrice,
+ (newChargeEntry(counter.getAndIncrement.toString,unitPrice,
startTime,endTime,difTime.toString,unitsD.toString,credits),difTime,unitsD)
}
- private[this] def toEventEntry(eventType:String,c:ChargeslotMsg) : (EventEntry,Long,Double) = {
+
+
+ private[this] def toEventEntry(eventType:String,c:ChargeslotMsg) : (EventEntryMsg,Long,Double) = {
val (c1,l1,d1) = toChargeEntry(c)
- (new EventEntry(eventType,List(c1)),l1,d1)
+ (newEventEntry(eventType,javaList(c1)),l1,d1)
}
- private[this] def toResourceEntry(w:WalletEntryMsg) : ResourceEntry = {
+ private[this] def toResourceEntry(w:WalletEntryMsg) : ResourceEntryMsg = {
assert(w.getSumOfCreditsToSubtract==0.0 || MessageHelpers.chargeslotCountOf(w) > 0)
val rcType = w.getResourceType.getName
val rcName = rcType match {
MessageHelpers.currentResourceEventOf(w).getInstanceID
}
val rcUnitName = w.getResourceType.getUnit
- val eventEntry = new ListBuffer[EventEntry]
val credits = w.getSumOfCreditsToSubtract
val eventType = //TODO: This is hardcoded; find a better solution
rcType match {
//c.getStopMillis - c.getStartMillis
var totalElapsedTime = 0L
var totalUnits = 0.0D
+ val eventEntry = new java.util.ArrayList[EventEntryMsg]() //new ListBuffer[EventEntry]
for { c <- w.getChargeslots.asScala }{
if(c.getCreditsToSubtract != 0.0) {
//Console.err.println("c.creditsToSubtract : " + c.creditsToSubtract)
val (e,l,u) = toEventEntry(eventType.toString,c)
- eventEntry += e
+ eventEntry.add(e) //eventEntry += e
totalElapsedTime += l
totalUnits += u
}
}
//Console.err.println("TOTAL resource event credits: " + credits)
- val re = new ResourceEntry(rcName,/*rcType,rcUnitName,*/credits.toString,totalElapsedTime.toString,
- totalUnits.toString,eventEntry.toList)
- re.unitName = rcUnitName
- re.resourceType = rcType
- re
+ /*val re =*/ newResourceEntry(rcName,rcType,rcUnitName,credits.toString,totalElapsedTime.toString,
+ totalUnits.toString,eventEntry)
+ //re.unitName = rcUnitName
+ //re.resourceType = rcType
+ //re
}
- private[this] def resourceEntriesAt(t:Timeslot,w:UserStateMsg) : (List[ResourceEntry],Double) = {
- val ret = new ListBuffer[ResourceEntry]
+ private[this] def resourceEntriesAt(t:Timeslot,w:UserStateMsg) : (java.util.List[ResourceEntryMsg],Double) = {
var sum = 0.0
//Console.err.println("Wallet entries: " + w.walletEntries)
import scala.collection.JavaConverters.asScalaBufferConverter
for { i <- walletEntries }
Console.err.println("WALLET ENTRY\n%s\nEND WALLET ENTRY".format(i.toJsonString))
Console.err.println("End wallet entries")*/
+ val ret = new java.util.ArrayList[ResourceEntryMsg]()//new ListBuffer[ResourceEntry]
for { i <- walletEntries} {
val referenceTimeslot = MessageHelpers.referenceTimeslotOf(i)
if(t.contains(referenceTimeslot) && i.getSumOfCreditsToSubtract.toDouble != 0.0){
/*Console.err.println("i.sumOfCreditsToSubtract : " + i.sumOfCreditsToSubtract)*/
if(i.getSumOfCreditsToSubtract.toDouble > 0.0D)
sum += i.getSumOfCreditsToSubtract.toDouble
- ret += toResourceEntry(i)
+ ret.add(toResourceEntry(i)) //ret += toResourceEntry(i)
} else {
val ijson = AvroHelpers.jsonStringOfSpecificRecord(i)
val itimeslot = MessageHelpers.referenceTimeslotOf(i)
- Console.err.println("IGNORING WALLET ENTRY : " + ijson + "\n" +
- t + " does not contain " + itimeslot + " !!!!")
+ // Console.err.println("IGNORING WALLET ENTRY : " + ijson + "\n" +
+ // t + " does not contain " + itimeslot + " !!!!")
}
}
- (ret.toList,sum)
+ (ret,sum)
}
- private[this] def aggregateResourceEntries(re:List[ResourceEntry]) : List[ServiceEntry] = {
- def addResourceEntries(a:ResourceEntry,b:ResourceEntry) : ResourceEntry = {
- assert(a.resourceName == b.resourceName)
- val totalCredits = (a.totalCredits.toDouble+b.totalCredits.toDouble).toString
- val totalElapsedTime = (a.totalElapsedTime.toLong+b.totalElapsedTime.toLong).toString
- val totalUnits = (a.totalUnits.toDouble+b.totalUnits.toDouble).toString
- val ab = a.copy(a.resourceName/*,a.resourceType,a.unitName*/,totalCredits,totalElapsedTime,totalUnits,
- a.details ::: b.details)
- ab.unitName = a.unitName
- ab.resourceType = a.resourceType
- ab
+ private[this] def aggregateResourceEntries(re:java.util.List[ResourceEntryMsg]) : java.util.List[ServiceEntryMsg] = {
+ def addResourceEntries(a:ResourceEntryMsg,b:ResourceEntryMsg) : ResourceEntryMsg = {
+ assert(a.getResourceName == b.getResourceName)
+ val totalCredits = (a.getTotalCredits.toDouble+b.getTotalCredits.toDouble).toString
+ val totalElapsedTime = (a.getTotalElapsedTime.toLong+b.getTotalElapsedTime.toLong).toString
+ val totalUnits = (a.getTotalUnits.toDouble+b.getTotalUnits.toDouble).toString
+ val msg = new ResourceEntryMsg
+
+ val details = new java.util.ArrayList[EventEntryMsg](a.getDetails)
+ details.addAll(b.getDetails)
+ msg.setResourceName(a.getResourceName)
+ msg.setResourceType(a.getResourceType)
+ msg.setUnitName(a.getUnitName)
+ msg.setTotalCredits(totalCredits)
+ msg.setTotalElapsedTime(totalElapsedTime)
+ msg.setTotalUnits(totalUnits)
+ msg.setDetails(details)
+ msg
+ /*/*val ab =*/ a.copy(a.getResourceName,a.getResourceType,a.getUnitName,totalCredits,totalElapsedTime,totalUnits,
+ {a.getDetails.addAll(b.details); a})
+ //ab.unitName = a.unitName
+ //ab.resourceType = a.resourceType
+ //ab*/
}
- val map0 = re.foldLeft(TreeMap[String,ResourceEntry]()){ (map,r1) =>
- map.get(r1.resourceName) match {
- case None => map + ((r1.resourceName,r1))
- case Some(r0) => (map - r0.resourceName) +
- ((r0.resourceName, addResourceEntries(r0,r1)))
+ import scala.collection.JavaConverters.asScalaBufferConverter
+ val map0 = re.asScala.foldLeft(TreeMap[String,ResourceEntryMsg]()){ (map,r1) =>
+ map.get(r1.getResourceName) match {
+ case None => map + ((r1.getResourceName,r1))
+ case Some(r0) => (map - r0.getResourceName) +
+ ((r0.getResourceName, addResourceEntries(r0,r1)))
}
}
- val map1 = map0.foldLeft(TreeMap[String,List[ResourceEntry]]()){ case (map,(_,r1)) =>
- map.get(r1.resourceType) match {
- case None => map + ((r1.resourceType,List(r1)))
- case Some(rl) => (map - r1.resourceType) + ((r1.resourceType,r1::rl))
+ val map1 = map0.foldLeft(TreeMap[String,List[ResourceEntryMsg]]()){ case (map,(_,r1)) =>
+ map.get(r1.getResourceType) match {
+ case None => map + ((r1.getResourceType,List(r1)))
+ case Some(rl) => (map - r1.getResourceType) + ((r1.getResourceType,r1::rl))
}
}
- map1.foldLeft(List[ServiceEntry]()){ case (ret,(serviceName,resList)) =>
+ import scala.collection.JavaConverters.seqAsJavaListConverter
+ map1.foldLeft(List[ServiceEntryMsg]()){ case (ret,(serviceName,resList)) =>
val (totalCredits,totalElapsedTime,totalUnits) =
resList.foldLeft((0.0D,0L,0.0D)){ case ((a,b,c),r) =>
- (a+r.totalCredits.toDouble,
- b+r.totalElapsedTime.toLong,
- c+r.totalUnits.toDouble
+ (a+r.getTotalCredits.toDouble,
+ b+r.getTotalElapsedTime.toLong,
+ c+r.getTotalUnits.toDouble
)}
- new ServiceEntry(serviceName,totalCredits.toString,
+ newServiceEntry(serviceName,totalCredits.toString,
totalElapsedTime.toString,totalUnits.toString,
- resList.head.unitName,resList) :: ret
- }
+ resList.head.getUnitName,resList.asJava) :: ret
+ }.asJava
}
- def addMissingServices(se:List[ServiceEntry],re:Map[String,ResourceType]) : List[ServiceEntry]=
- se:::(re -- se.map(_.serviceName).toSet).foldLeft(List[ServiceEntry]()) { case (ret,(name,typ:ResourceType)) =>
- new ServiceEntry(name,"0.0","0","0.0",typ.unit,List[ResourceEntry]()) :: ret
- }
+ def addMissingServices(se0:java.util.List[ServiceEntryMsg],re:Map[String,ResourceType]) :
+ java.util.List[ServiceEntryMsg]= {
+ import scala.collection.JavaConverters.asScalaBufferConverter
+ val se = se0.asScala.toList
+ import scala.collection.JavaConverters.seqAsJavaListConverter
+ (se :::(re -- se.map(_.getServiceName).toSet).foldLeft(List[ServiceEntryMsg]()) { case (ret,(name,typ:ResourceType)) =>
+ newServiceEntry(name,"0.0","0","0.0",typ.unit,new java.util.ArrayList[ResourceEntryMsg]()) :: ret
+ }).asJava
+ }
def fromWorkingUserState(t0:Timeslot,userID:String,w:Option[UserStateMsg],
- resourceTypes:Map[String,ResourceType]) : AbstractBillEntry = {
+ resourceTypes:Map[String,ResourceType]) : BillEntryMsg = {
val t = t0.roundMilliseconds /* we do not care about milliseconds */
//Console.err.println("Timeslot: " + t0)
//Console.err.println("After rounding timeslot: " + t)
val ret = w match {
case None =>
- val allMissing = addMissingServices(Nil,resourceTypes)
- new BillEntry(counter.getAndIncrement.toString,
+ val allMissing = addMissingServices(new util.ArrayList[ServiceEntryMsg](),resourceTypes)
+ newBillEntry(counter.getAndIncrement.toString,
userID,"processing",
"0.0",
"0.0",
allMissing)
case Some(w) =>
val wjson = AvroHelpers.jsonStringOfSpecificRecord(w)
- Console.err.println("Working user state: %s".format(wjson))
+ //Console.err.println("Working user state: %s".format(wjson))
val (rcEntries,rcEntriesCredits) = resourceEntriesAt(t,w)
val resList0 = aggregateResourceEntries(rcEntries)
val resList1 = addMissingServices(resList0,resourceTypes)
- new BillEntry(counter.getAndIncrement.toString,
+ newBillEntry(counter.getAndIncrement.toString,
userID,"ok",
w.getTotalCredits.toString,
rcEntriesCredits.toString,
t.to.getTime.toString,
resList1)
}
- //Console.err.println("JSON: " + ret.toJsonString)
+ //Console.err.println("JSON: " + AvroHelpers.jsonStringOfSpecificRecord(ret))
ret
}
import scala.collection.JavaConverters.seqAsJavaListConverter
import scala.Predef.Map
import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.charging.bill._
+import gr.grnet.aquarium.charging.bill.ChargeEntry
+import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.charging.state.UserStateBootstrap
+import gr.grnet.aquarium.charging.bill.ResourceEntry
+import gr.grnet.aquarium.charging.bill.ServiceEntry
/**
* Provides helper methods that construct avro messages.
msg
}
+ def toJavaList[A](l:List[A]) : java.util.List[A] = {
+ val al = new java.util.ArrayList[A]()
+ l.foreach(al.add(_))
+ al
+ }
+
+ def chargeEntryMsg(chargeEntry:ChargeEntry) : ChargeEntryMsg = {
+ val msg = new ChargeEntryMsg
+ msg.setId(chargeEntry.id)
+ msg.setUnitPrice(chargeEntry.unitPrice)
+ msg.setStartTime(chargeEntry.startTime)
+ msg.setEndTime(chargeEntry.endTime)
+ msg.setElapsedTime(chargeEntry.elapsedTime)
+ msg.setUnits(chargeEntry.units)
+ msg.setCredits(chargeEntry.credits)
+ msg
+ }
+
+ def eventEntryMsg(eventEntry:EventEntry) : EventEntryMsg = {
+ val msg = new EventEntryMsg
+ msg.setEventType(eventEntry.eventType)
+ msg.setDetails(toJavaList(eventEntry.details.map(chargeEntryMsg(_))))
+ msg
+ }
+
+ def resourceEntryMsg(resourceEntry:ResourceEntry) : ResourceEntryMsg = {
+ val msg = new ResourceEntryMsg
+ msg.setResourceName(resourceEntry.resourceName)
+ msg.setResourceType(resourceEntry.resourceType)
+ msg.setUnitName(resourceEntry.unitName)
+ msg.setTotalCredits(resourceEntry.totalCredits)
+ msg.setTotalElapsedTime(resourceEntry.totalElapsedTime)
+ msg.setTotalUnits(resourceEntry.totalUnits)
+ msg.setDetails(toJavaList(resourceEntry.details.map(eventEntryMsg(_))))
+ msg
+ }
+
+ def createServiceEntryMsg(serviceEntry:ServiceEntry) : ServiceEntryMsg = {
+ val msg = new ServiceEntryMsg
+ msg.setServiceName(serviceEntry.serviceName)
+ msg.setTotalCredits(serviceEntry.totalCredits)
+ msg.setTotalElapsedTime(serviceEntry.totalElapsedTime)
+ msg.setTotalUnits(serviceEntry.totalUnits)
+ msg.setUnitName(serviceEntry.unitName)
+ msg.setDetails(toJavaList(serviceEntry.details.map(resourceEntryMsg(_))))
+ msg
+ }
+ def createBillEntryMsg(billEntry:BillEntry) : BillEntryMsg = {
+ val msg = new BillEntryMsg
+ msg.setId(billEntry.id)
+ msg.setUserID(billEntry.userID)
+ msg.setStatus(billEntry.status)
+ msg.setRemainingCredits(billEntry.remainingCredits)
+ msg.setDeductedCredits(billEntry.deductedCredits)
+ msg.setStartTime(billEntry.startTime)
+ msg.setEndTime(billEntry.endTime)
+ msg.setBill(toJavaList(billEntry.bill.map(createServiceEntryMsg(_))))
+ msg
+ }
}
import gr.grnet.aquarium.policy.CronSpec
import gr.grnet.aquarium.message.avro.gen.{BillEntryMsg, IMEventMsg, ResourceEventMsg}
import org.apache.avro.specific.SpecificRecord
+import util.json.JsonSupport
+import actors.Future
/*
update(Aquarium.EnvKeys.eventsStoreFolder,Some(new File(".."))).
build()
}
- def run(billWait:Int, stop:Int)(f : => String) : String = {
- var _ret = ""
+ def run(billWait:Int, stop:Int)(f : => Unit) = {
aquarium.start
Thread.sleep(billWait)
try{
- _ret = f
+ f
} finally {
Console.err.println("Stopping aquarium")
+ aquarium.stop
Thread.sleep(stop)
Console.err.println("Stopping aquarium --- DONE")
- aquarium.stop
}
- _ret
}
}
} */
object MessageService {
- val rabbitMQEnabled = false
- val debugEnabled = false
- def send(event:SpecificRecord) = {
+ def send(event:SpecificRecord, rabbitMQEnabled : Boolean = false, debugEnabled:Boolean =false) = {
val json = AvroHelpers.jsonStringOfSpecificRecord(event)
if(rabbitMQEnabled){
val (exchangeName,routingKey) = event match {
case Some(millis) =>
updateMap(map)
val event = makeEvent(millis,_map)
- MessageService.send(event)
+ val ren = _map.getOrElse("rabbitMQEnabled","false").toBoolean
+ val rdb = _map.getOrElse("debugEnabled","false").toBoolean
+ MessageService.send(event,ren,rdb)
_messagesSent += 1
true
case None =>
def apply(typ:String,args:Tuple2[String,String]*) : Message =
apply(typ,args.foldLeft(Map[String,String]())({(map,arg)=> map + arg}))
+ val msgMap = Map[String,()=>Message](
+ "vm" -> (() => new VMMessage),
+ "disk" -> (() => new DiskMessage),
+ "create" -> (() => new CreationMessage),
+ "credits" -> (() => new AddCreditsMessage)
+ )
+
def apply(typ:String,map:Map[String,String]) : Message = {
- val msg = typ match {
- case "vm" => new VMMessage
- case "disk" => new DiskMessage
- case "create" => new CreationMessage
- case "credits" => new AddCreditsMessage
- case _ => throw new Exception("unknown type")
- }
+ val msg = msgMap.getOrElse(typ,throw new Exception("Invalid type : "+typ))()
msg.updateMap(map)
msg
}
val uid = "user%d@grnet.gr".format(UID.next)
val _creationMessage : Message = Message("create","uid"->uid,"month"->month.toString,"spec"->"")
var _resources : List[Message] = Nil
+ var _billEntryMsg :Option[BillEntryMsg] = None
+ override def toString() = uid
+ def validateResults() : Boolean = {
+ throw new Exception("Not implemented !!!!")
+ }
+
+ def printResults() = {
+ Console.err.println("Messages sent:")
+ for { m <- JsonLog.get}
+ Console.err.println("%s".format(m)) //"\n==============\n%s\n==============="
+ Console.err.println("\n=========================\n")
+ Console.err.println("Response:\n" + (_billEntryMsg match {
+ case None => "NONE!!!!"
+ case Some(r) => AvroHelpers.jsonStringOfSpecificRecord(r)
+ }))
+ }
def add(no:Int,typ:String,args:Tuple2[String,String]*) : User =
add(no,typ,args.foldLeft(Map[String,String]())({(map,arg)=> map + arg}))
this
}
- def addVMs(no:Int,status:String,cronSpec:String) : User =
+ def addVMs(no:Int,cronSpec:String) : User =
add(no,"vm",{i =>
Map("instanceID"->"cyclades.vm.%d".format(i),
"vmName" -> "Virtual Machine #%d".format(i),
- "status" -> status,
+ "status" -> "on", // initially "on" msg
"spec" -> cronSpec)})
- def addFiles(no:Int,action:String,value:Int,minVal:Int,maxVal:Int,spec:String) : User =
+ def addFiles(no:Int,action:String/*,value:Int,minVal:Int,maxVal:Int*/,spec:String) : User =
add(no,"disk",{i =>
Map("action" -> action,
"path"->"/Papers/file_%d.PDF".format(i),
- "value"->UID.random(minVal,maxVal).toString,
+ //"value"->UID.random(minVal,maxVal).toString,
"spec" -> spec
)
})
- def addCredits(amount:Int,spec:String) : User = {
- add(1,"credits","month"->month.toString,"uid"->uid,"spec"->spec,"amount"->amount.toString)
+ def addCredits(no:Int,spec:String) : User = {
+ add(no,"credits",/*"month"->month.toString,"uid"->uid,*/"spec"->spec/*,"amount"->amount.toString*/)
}
- def run(ordered:Boolean,wait:Int,minFile:Int,maxFile:Int,minAmount:Int,maxAmount:Int,maxJSONRetry:Int=10) : String = {
+ def run(ordered:Boolean,wait:Int,minFile:Int,maxFile:Int,minAmount:Int,maxAmount:Int,maxJSONRetry :Int,
+ sendViaRabbitMQ:Boolean, sendDebugEnabled : Boolean) = {
+ var _messagesSent : List[Message] = Nil
_creationMessage.send("month"->month.toString,"uid"->uid,"spec"->"0 0 * %d ?".format(month)) // send once!
- Thread.sleep(4000)
+ //Thread.sleep(2000)
var iter = _resources.toList
while(!iter.isEmpty)
iter = (if(!ordered) iter
case (None,None) => true
case (None,Some(l)) => true
case (Some(l),None) => false
- }}).filter(_.send("value"->UID.random(minFile,maxFile).toString,
- "amount"->UID.random(minAmount,maxAmount).toString //,
- //"status" -> UID.random(List("off","on"))
- ))
-
+ }}).filter({m =>
+ _messagesSent = _messagesSent ::: List(m)
+ m.send("value"->UID.random(minFile,maxFile).toString,
+ "amount"->UID.random(minAmount,maxAmount).toString,
+ "rabbitMQEnabled" -> sendViaRabbitMQ.toString,
+ "debugEnabled" -> sendDebugEnabled.toString
+ //"status" -> UID.random(List("off","on"))
+ )})
Thread.sleep(wait)
- getJSON(maxJSONRetry)
+ _billEntryMsg = getBillResponse(maxJSONRetry)
}
- def getJSON(max:Int=10) : String = {
+ private[this] def getBillResponse(max:Int) : Option[BillEntryMsg] = {
def get () : String = {
val fromMillis = _creationMessage._range.from.getTime
val toMillis = _creationMessage._range.to.getTime
}
var resp = ""
var count = 0
+ var ret : Option[BillEntryMsg] = None
while(resp.isEmpty && count < max){
if(count > 0) Console.err.println("Retrying for bill request.")
resp = get()
if(resp.isEmpty) Thread.sleep(1000)
- //val b = AvroHelpers.specificRecordOfJsonString(resp, new BillEntryMsg)
- if(resp.indexOf("processing") > -1){
- Thread.sleep(1000)
- resp = ""
+ else {
+ try{
+ var b = AvroHelpers.specificRecordOfJsonString(resp, new BillEntryMsg)
+ ret = Some(b)
+ if(b.getStatus().equals("processing")){
+ Thread.sleep(1000)
+ resp = ""
+ }
+ } catch {
+ case e:Exception =>
+ e.printStackTrace
+ resp = ""
+ }
}
//sleep(1000L)
count += 1
}
- resp
+ ret
+ }
+}
+
+class Resource(
+ val resType : String, // Message.msgMap.keys
+ val instances: Long,
+ val cronSpec : String
+ )
+extends JsonSupport {}
+
+class Scenario(
+ val ignoreScenario : Boolean,
+ val host : String,
+ val port : Long,
+ val sendOrdered : Boolean,
+ val sendViaRabbitMQ : Boolean,
+ val sendDebugEnabled : Boolean,
+ val validationEnabled : Boolean,
+ val billingMonth: Long,
+ val aquariumStartWaitMillis : Long,
+ val aquariumStopWaitMillis : Long,
+ val billResponseWaitMillis : Long,
+ val numberOfUsers : Long,
+ val numberOfResponseRetries : Long,
+ val minFileCredits : Long,
+ val maxFileCredits : Long,
+ val minUserCredits : Long,
+ val maxUserCredits : Long,
+ val resources : List[Resource]
+)
+extends JsonSupport {}
+
+class Scenarios(
+ val scenarios : List[Scenario] )
+extends JsonSupport {}
+
+object ScenarioRunner {
+ val aquarium = AquariumInstance.aquarium
+
+ def parseScenario(txt:String) : Scenario =
+ StdConverters.AllConverters.convertEx[Scenario](txt)
+
+ def parseScenarios(txt:String) : Scenarios =
+ StdConverters.AllConverters.convertEx[Scenarios](txt)
+
+ def runScenario(txt:String) : Unit = runScenario(parseScenario(txt))
+
+ private[this] def runUser(s:Scenario) : User = {
+ val user = new User("%s:%d".format(s.host,s.port),s.billingMonth.toInt)
+ val (minFileCredits,maxFileCredits) = (s.minFileCredits,s.maxFileCredits)
+ val (minUserCredits,maxUserCredits) = (s.maxUserCredits,s.maxUserCredits)
+ //Cron spec minutes hours day-of-month Month Day-of-Week (we do not specify seconds)
+ AquariumInstance.run(s.aquariumStartWaitMillis.toInt,s.aquariumStopWaitMillis.toInt) {
+ for{ r <- s.resources} // create messages
+ r.resType match {
+ case "vm" =>
+ user.addVMs(r.instances.toInt,r.cronSpec)
+ case "disk" =>
+ user.addFiles(r.instances.toInt,"update",r.cronSpec)
+ case "credits" =>
+ user.addCredits(r.instances.toInt,r.cronSpec)
+ }
+ // run scenario
+ user.run(s.sendOrdered,s.billResponseWaitMillis.toInt,s.minFileCredits.toInt,
+ s.maxFileCredits.toInt,s.minUserCredits.toInt,s.maxUserCredits.toInt,
+ s.numberOfResponseRetries.toInt,s.sendViaRabbitMQ,s.sendDebugEnabled)
+ }
+ user
+ }
+
+ def runScenario(s:Scenario): Unit = {
+ if(s.ignoreScenario == false) {
+ Console.err.println("=================\nRunning scenario:\n %s\n=======================\n".format(s.toJsonString))
+ val tasks = for { u <- 1 to s.numberOfUsers.toInt}
+ yield scala.actors.Futures.future(runUser(s))
+ val users = for { u <- tasks} yield u()
+ users.foreach {u =>
+ u.printResults()
+ if(s.validationEnabled && u.validateResults() == false)
+ Console.err.println("Validation FAILED for user " + u)
+ }
+ Console.err.println("\n=========================\nStopping scenario\n=======================")
+ }
+ }
+
+ def runScenarios(txt:String) : Unit = runScenarios(parseScenarios(txt))
+
+ def runScenarios(ss:Scenarios) = {
+ Console.err.println("=================\nScenarios:\n %s\n=======================\n".format(ss.toJsonString))
+ ss.scenarios.foreach(runScenario(_))
}
+
}
object UserTest extends Loggable {
- val aquarium = AquariumInstance.aquarium
+ //vm,disk,credits
+ //add(1,"credits","month"->month.toString,"uid"->uid,"spec"->spec,"amount"->amount.toString)
+ /*
+ val host : String,
+ val port : Long,
+ val sendOrdered : Boolean,
+ val sendViaRabbitMQ : Boolean,
+ val sendDebugEnabled : Boolean,
+ val validationEnabled : Boolean,
+ val billingMonth: Long,
+ val aquariumStartWaitMillis : Long,
+ val aquariumStopWaitMillis : Long,
+ val billResponseWaitMillis : Long,
+ val numberOfUsers : Long,
+ val numberOfResponseRetries : Long,
+ val minFileCredits : Long,
+ val maxFileCredits : Long,
+ val minUserCredits : Long,
+ val maxUserCredits : Long,
+ val resources : List[Resource]
+
+ */
+ val basic = new Scenario(false,"localhost",8888,true,false,false,false,9,2000,2000,2000,
+ 1,10,2000,5000,10000,50000,List[Resource](
+ new Resource("credits",1, "00 00 10,12 9 ?"),
+ new Resource("disk",1,"00 18 15,20,29,30 9 ?"),
+ new Resource("vm",1,"00 18 14,17,19,20 9 ?")
+ ))
def main(args: Array[String]) = {
- val user = new User("localhost:8888",9)
+
+ try{
+ val lines = scala.io.Source.fromFile(args.head).mkString
+ ScenarioRunner.runScenarios(new Scenarios(List(basic)))
+ } catch {
+ case e:Exception =>
+ e.printStackTrace()
+ ScenarioRunner.runScenarios(new Scenarios(List(basic)))
+ }
+
+
+/* val user = new User("localhost:8888",9)
val (minFileCredits,maxFileCredits) = (2000,5000)
val (minUserCredits,maxUserCredits) = (10000,10000)
//Cron spec minutes hours day-of-month Month Day-of-Week (we do not specify seconds)
val json =AquariumInstance.run(2000,2000) {
user.
- addCredits(100000,"00 00 10,12 9 ?").
+ addCredits(1,"00 00 10,12 9 ?").
addFiles(1,"update",2000,1000,3000,"00 18 15,20,29,30 9 ?").
- addVMs(1,"on","00 18 14,17,19,20 9 ?").
+ addVMs(1,"00 18 14,17,19,20 9 ?").
//addVMs(5,"on","00 18 ? 9 Tue")
run(true,2000,minFileCredits,maxFileCredits,minUserCredits,maxUserCredits)
}
for { m <- JsonLog.get}
Console.err.println("%s".format(m)) //"\n==============\n%s\n==============="
Console.err.println("\n=========================\n")
- Console.err.println("Response:\n" + json)
+ Console.err.println("Response:\n" + json)*/
}
}
-
+/*
object BillTest extends Loggable {
type JSON = String
runTestCase(testCase1)
}
}
+*/