Skip to content
This repository has been archived by the owner on Jul 19, 2022. It is now read-only.

Commit

Permalink
Fix error when status not defined
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasferry committed Aug 3, 2015
1 parent 4914826 commit abc9576
Show file tree
Hide file tree
Showing 14 changed files with 79 additions and 56 deletions.
Expand Up @@ -62,7 +62,7 @@ public class AzureConnector implements Connector{


private ComputeManagementClient computeManagementClient; private ComputeManagementClient computeManagementClient;
private HostedServiceOperations hostedServicesOperations; private HostedServiceOperations hostedServicesOperations;
private HashMap<String,String> runtimeInformation; private HashMap<String,Object> runtimeInformation;


public AzureConnector(String endpoint, String provider,String login,String secretKey){ public AzureConnector(String endpoint, String provider,String login,String secretKey){
journal.log(Level.INFO, ">> Connecting to "+provider+" ..."); journal.log(Level.INFO, ">> Connecting to "+provider+" ...");
Expand Down Expand Up @@ -98,8 +98,8 @@ public void execCommand(String id, String command, String login, String key) {
} }


@Override @Override
public HashMap<String, String> createInstance(VMInstance a) { public HashMap<String, Object> createInstance(VMInstance a) {
runtimeInformation=new HashMap<String, String>(); runtimeInformation=new HashMap<String, Object>();
VM vm = a.getType(); VM vm = a.getType();
ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED; ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED;


Expand Down Expand Up @@ -199,7 +199,7 @@ public HashMap<String, String> createInstance(VMInstance a) {
} }


state = ComponentInstance.State.RUNNING; state = ComponentInstance.State.RUNNING;
runtimeInformation.put("status", state.toString()); runtimeInformation.put("status", state);
return runtimeInformation; return runtimeInformation;
} }


Expand Down
Expand Up @@ -60,7 +60,7 @@ public class CloudSigmaConnector implements Connector {
private ComputeServiceContext computeContext; private ComputeServiceContext computeContext;
private ComputeService compute; private ComputeService compute;
private String provider; private String provider;
private HashMap<String,String> runtimeInformation; private HashMap<String,Object> runtimeInformation;
private CloudSigma2Api cloudSigmaApi; private CloudSigma2Api cloudSigmaApi;




Expand Down Expand Up @@ -124,9 +124,9 @@ private String readSshKey(String keyPath){




@Override @Override
public HashMap<String, String> createInstance(VMInstance a) { public HashMap<String, Object> createInstance(VMInstance a) {
VM vm = a.getType(); VM vm = a.getType();
runtimeInformation=new HashMap<String, String>(); runtimeInformation=new HashMap<String, Object>();
ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED; ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED;


// First try to find the desired template drive in MyDrives // First try to find the desired template drive in MyDrives
Expand Down Expand Up @@ -230,7 +230,7 @@ public HashMap<String, String> createInstance(VMInstance a) {
} }




runtimeInformation.put("status", state.toString()); runtimeInformation.put("status", state);
return runtimeInformation; return runtimeInformation;
} }


Expand Down
Expand Up @@ -31,7 +31,7 @@ public interface Connector {


public void execCommand(String id, String command, String login, String key); public void execCommand(String id, String command, String login, String key);


public HashMap<String,String> createInstance(VMInstance a); public HashMap<String,Object> createInstance(VMInstance a);


public void destroyVM(String id); public void destroyVM(String id);


Expand Down
Expand Up @@ -49,7 +49,7 @@ public class FlexiantConnector implements Connector{
private final String endpoint; private final String endpoint;
private UserService service; private UserService service;
private BindingProvider portBP; private BindingProvider portBP;
private HashMap<String,String> runtimeInformation=new HashMap<String, String>(); private HashMap<String,Object> runtimeInformation=new HashMap<String, Object>();


@SuppressWarnings("restriction") @SuppressWarnings("restriction")
public FlexiantConnector(String endPoint, String login, String secretKey) throws MalformedURLException{ public FlexiantConnector(String endPoint, String login, String secretKey) throws MalformedURLException{
Expand Down Expand Up @@ -150,7 +150,7 @@ public List<Object> getListImages(){
} }
} }


public HashMap<String,String> createInstance(VMInstance a){ public HashMap<String,Object> createInstance(VMInstance a){
ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED; ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED;
try { try {
Server template = new Server(); Server template = new Server();
Expand All @@ -160,7 +160,7 @@ public HashMap<String,String> createInstance(VMInstance a){


template.setResourceType(ResourceType.SERVER); template.setResourceType(ResourceType.SERVER);


journal.log(Level.INFO, ">> Provisioning a vm ..."+vm.getGroupName()); journal.log(Level.INFO, ">> Provisioning a vm ...");


if (vm.getMinCores() > 0 && vm.getMinRam() > 0) if (vm.getMinCores() > 0 && vm.getMinRam() > 0)
template.setProductOfferUUID(findProduct(((double) vm.getMinRam()), vm.getMinCores())); template.setProductOfferUUID(findProduct(((double) vm.getMinRam()), vm.getMinCores()));
Expand Down Expand Up @@ -226,7 +226,7 @@ public HashMap<String,String> createInstance(VMInstance a){
//a.setStatusAsError(); //a.setStatusAsError();
state = ComponentInstance.State.ERROR; state = ComponentInstance.State.ERROR;
} }
runtimeInformation.put("status", state.toString()); runtimeInformation.put("status", state);
return runtimeInformation; return runtimeInformation;
} }


Expand All @@ -237,9 +237,17 @@ public void execCommand(VMInstance n, String command, String login, String keyPa




public void execCommand(String id, String command, String login, String keyPath){ public void execCommand(String id, String command, String login, String keyPath){

Server temp=(Server)findObjectResourceByID(id, ResourceType.SERVER); Server temp=(Server)findObjectResourceByID(id, ResourceType.SERVER);
String ip=temp.getNics().get(0).getIpAddresses().get(0).getIpAddress(); String ip=temp.getNics().get(0).getIpAddresses().get(0).getIpAddress();
SSHConnector sc=new SSHConnector(keyPath, login, ip); SSHConnector sc=new SSHConnector(keyPath, login, ip);
while (!sc.checkConnectivity()){
try {
Thread.sleep(32000);
} catch (InterruptedException e) {
journal.log(Level.SEVERE, e.getMessage());
}
}
try { try {
Thread.sleep(32000); Thread.sleep(32000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
Expand Down
Expand Up @@ -81,7 +81,7 @@ public class JCloudsConnector implements Connector{
private String provider; private String provider;
private ComputeServiceContext computeContext; private ComputeServiceContext computeContext;
private EC2Api ec2api; private EC2Api ec2api;
private HashMap<String,String> runtimeInformation; private HashMap<String,Object> runtimeInformation;


public JCloudsConnector(String provider,String login,String secretKey){ public JCloudsConnector(String provider,String login,String secretKey){
journal.log(Level.INFO, ">> Connecting to "+provider+" ..."); journal.log(Level.INFO, ">> Connecting to "+provider+" ...");
Expand Down Expand Up @@ -263,8 +263,8 @@ public void updateVMMetadata(VMInstance a){
* @param a description of the VM to be created * @param a description of the VM to be created
* @return * @return
*/ */
public HashMap<String,String> createInstance(VMInstance a){ public HashMap<String,Object> createInstance(VMInstance a){
runtimeInformation=new HashMap<String, String>(); runtimeInformation=new HashMap<String, Object>();
VM vm = a.getType(); VM vm = a.getType();
ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED; ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED;
NodeMetadata cm= (NodeMetadata)getVMByName(a.getName()); NodeMetadata cm= (NodeMetadata)getVMByName(a.getName());
Expand Down Expand Up @@ -342,7 +342,7 @@ public HashMap<String,String> createInstance(VMInstance a){
state = ComponentInstance.State.RUNNING; state = ComponentInstance.State.RUNNING;


} }
runtimeInformation.put("status", state.toString()); runtimeInformation.put("status", state);
return runtimeInformation; return runtimeInformation;
} }


Expand Down
Expand Up @@ -73,7 +73,7 @@ public class OpenStackConnector implements Connector{
private ComputeService novaComputeService; private ComputeService novaComputeService;
private final String endpoint; private final String endpoint;
private NovaApi serverApi; private NovaApi serverApi;
private HashMap<String,String> runtimeInformation=new HashMap<String, String>(); private HashMap<String,Object> runtimeInformation=new HashMap<String, Object>();


public OpenStackConnector(String endPoint,String provider,String login,String secretKey){ public OpenStackConnector(String endPoint,String provider,String login,String secretKey){
this.endpoint=endPoint; this.endpoint=endPoint;
Expand Down Expand Up @@ -338,7 +338,7 @@ public Image checkIfImageExist(String name){
* @param a description of the VM to be created * @param a description of the VM to be created
* @return * @return
*/ */
public HashMap<String,String> createInstance(VMInstance a){ public HashMap<String,Object> createInstance(VMInstance a){
ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED; ComponentInstance.State state = ComponentInstance.State.UNRECOGNIZED;
VM vm = a.getType(); VM vm = a.getType();
ComputeMetadata cm= getVMByName(a.getName()); ComputeMetadata cm= getVMByName(a.getName());
Expand Down Expand Up @@ -439,7 +439,7 @@ public HashMap<String,String> createInstance(VMInstance a){


state = ComponentInstance.State.RUNNING; state = ComponentInstance.State.RUNNING;
} }
runtimeInformation.put("status",state.toString()); runtimeInformation.put("status",state);
return runtimeInformation; return runtimeInformation;
} }


Expand Down
Expand Up @@ -140,17 +140,17 @@ public Boolean execCommandSsh(String command){
in = channel.getInputStream(); in = channel.getInputStream();
InputStream extIn=channel.getExtInputStream(); InputStream extIn=channel.getExtInputStream();
channel.connect(); channel.connect();
byte[] tmp=new byte[2048]; byte[] tmp=new byte[4096];
byte[] tmp2=new byte[2048]; byte[] tmp2=new byte[4096];
while(true){ while(true){
while(in.available()>0 || extIn.available()>0){ while(in.available()>0 || extIn.available()>0){
if(in.available()>0){ if(in.available()>0){
int i=in.read(tmp, 0, 2048); int i=in.read(tmp, 0, 4096);
if(i<0)break; if(i<0)break;
journal.log(Level.INFO, ">> "+ new String(tmp, 0, i)); journal.log(Level.INFO, ">> "+ new String(tmp, 0, i));
} }
if(extIn.available()>0){ if(extIn.available()>0){
int i=extIn.read(tmp2, 0, 2048); int i=extIn.read(tmp2, 0, 4096);
if(i<0)break; if(i<0)break;
journal.log(Level.INFO, ">> "+ new String(tmp2, 0, i)); journal.log(Level.INFO, ">> "+ new String(tmp2, 0, i));
} }
Expand Down
25 changes: 13 additions & 12 deletions deployer/src/main/java/org/cloudml/deployer/CloudAppDeployer.java
Expand Up @@ -364,7 +364,7 @@ private void prepareAnInternalComponent(InternalComponentInstance instance, Comp
}*/ }*/


for(InternalComponentInstance ici: host.hostedComponents()){ for(InternalComponentInstance ici: host.hostedComponents()){
coordinator.updateStatus(ici.getName(), InternalComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatusInternalComponent(ici.getName(), InternalComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName());
} }
coordinator.updateStatusInternalComponent(host.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatusInternalComponent(host.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName());
} }
Expand Down Expand Up @@ -768,20 +768,21 @@ private void provisionAVM(VMInstance n) {
} }
Provider p = n.getType().getProvider(); Provider p = n.getType().getProvider();
Connector jc = ConnectorFactory.createIaaSConnector(p); Connector jc = ConnectorFactory.createIaaSConnector(p);
coordinator.updateStatus(n.getName(), ComponentInstance.State.PENDING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(n.getName(), ComponentInstance.State.PENDING, CloudAppDeployer.class.getName());
HashMap<String,String> runtimeInformation = jc.createInstance(n); HashMap<String,Object> runtimeInformation = jc.createInstance(n);
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
coordinator.updateStatus(n.getName(), runtimeInformation.get("status"), CloudAppDeployer.class.getName()); journal.log(Level.INFO, ">> Status: "+runtimeInformation.get("status"));
coordinator.updateStatus(n.getName(), (ComponentInstance.State)runtimeInformation.get("status"), CloudAppDeployer.class.getName());
try { try {
Thread.sleep(1000); Thread.sleep(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
coordinator.updateIP(n.getName(),runtimeInformation.get("publicAddress"),CloudAppDeployer.class.getName()); coordinator.updateIP(n.getName(),runtimeInformation.get("publicAddress").toString(),CloudAppDeployer.class.getName());
//enable the monitoring of the new machine //enable the monitoring of the new machine
if (statusMonitorActive) { if (statusMonitorActive) {
statusMonitor.attachModule(jc); statusMonitor.attachModule(jc);
Expand Down Expand Up @@ -822,7 +823,7 @@ private void provisionAPlatform(ExternalComponentInstance n) {
String pa=connector.getDBEndPoint(eci.getName(), 600); String pa=connector.getDBEndPoint(eci.getName(), 600);
eci.setPublicAddress(pa); eci.setPublicAddress(pa);
coordinator.updateIP(n.getName(),pa,CloudAppDeployer.class.getName()); coordinator.updateIP(n.getName(),pa,CloudAppDeployer.class.getName());
coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
//execute the configure command //execute the configure command
/*if (!n.getType().getResources().isEmpty()) { /*if (!n.getType().getResources().isEmpty()) {
for (Resource r : n.getType().getResources()) { for (Resource r : n.getType().getResources()) {
Expand All @@ -837,7 +838,7 @@ private void provisionAPlatform(ExternalComponentInstance n) {
if (ec.getServiceType().toLowerCase().equals("messagequeue")) { if (ec.getServiceType().toLowerCase().equals("messagequeue")) {
String url = connector.createQueue(n.getName()); String url = connector.createQueue(n.getName());
eci.setPublicAddress(url); eci.setPublicAddress(url);
coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
} }
if(ec.getServiceType().toLowerCase().equals("loadbalancer")){ if(ec.getServiceType().toLowerCase().equals("loadbalancer")){
String endpoint = ec.getEndPoint(); String endpoint = ec.getEndPoint();
Expand Down Expand Up @@ -868,7 +869,7 @@ private void provisionAPlatform(ExternalComponentInstance n) {
journal.log(Level.INFO, ">>Add pool:" + pConnector.addPool(eci.getName() + "Back", testPool)); journal.log(Level.INFO, ">>Add pool:" + pConnector.addPool(eci.getName() + "Back", testPool));


journal.log(Level.INFO, ">> " + pConnector.addGateway(gateway)); journal.log(Level.INFO, ">> " + pConnector.addGateway(gateway));
coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(n.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
} }
if (statusMonitorActive) { if (statusMonitorActive) {
statusMonitor.attachModule(connector); statusMonitor.attachModule(connector);
Expand All @@ -895,13 +896,13 @@ protected void configureWithRelationships(RelationshipInstanceGroup relationship
if (valet != null) if (valet != null)
valet.config(); valet.config();
else if(res.hasProperty("db-binding-alias")){ else if(res.hasProperty("db-binding-alias")){
coordinator.updateStatus(bi.getProvidedEnd().getOwner().get().getName(), ComponentInstance.State.PENDING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(bi.getProvidedEnd().getOwner().get().getName(), ComponentInstance.State.PENDING, CloudAppDeployer.class.getName());
try{ try{
Provider p = ((ExternalComponent) bi.getProvidedEnd().getOwner().get().getType()).getProvider(); Provider p = ((ExternalComponent) bi.getProvidedEnd().getOwner().get().getType()).getProvider();
PaaSConnector connector = ConnectorFactory.createPaaSConnector(p); PaaSConnector connector = ConnectorFactory.createPaaSConnector(p);
String alias = res.getProperties().valueOf("db-binding-alias"); String alias = res.getProperties().valueOf("db-binding-alias");
connector.bindDbToApp(bi.getRequiredEnd().getOwner().getName(), bi.getProvidedEnd().getOwner().getName(), alias); connector.bindDbToApp(bi.getRequiredEnd().getOwner().getName(), bi.getProvidedEnd().getOwner().getName(), alias);
coordinator.updateStatus(bi.getProvidedEnd().getOwner().get().getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(bi.getProvidedEnd().getOwner().get().getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
}catch(Exception ex){ }catch(Exception ex){
ex.printStackTrace(); ex.printStackTrace();
journal.log(Level.INFO, ">> db-binding only works for PaaS databases" ); journal.log(Level.INFO, ">> db-binding only works for PaaS databases" );
Expand Down Expand Up @@ -988,7 +989,7 @@ else if (serveri.isExternal() && "loadbalancer".equals(((ExternalComponentInstan
journal.log(Level.INFO, ">>Modify backend: "+connector.addPool(serveri.getName()+"Back", backend)); journal.log(Level.INFO, ">>Modify backend: "+connector.addPool(serveri.getName()+"Back", backend));
journal.log(Level.INFO, ">>Delete Target: "+connector.deleteTarget(serveri.getName()+"Back", "targetOneHold")); journal.log(Level.INFO, ">>Delete Target: "+connector.deleteTarget(serveri.getName()+"Back", "targetOneHold"));
connector.start(); connector.start();
coordinator.updateStatus(serveri.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(serveri.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
} }
else if (bi.getRequiredEnd().getType().isRemote()) { else if (bi.getRequiredEnd().getType().isRemote()) {
RequiredPortInstance client = bi.getRequiredEnd(); RequiredPortInstance client = bi.getRequiredEnd();
Expand Down Expand Up @@ -1154,7 +1155,7 @@ private void terminateVM(VMInstance n) {
Connector jc = ConnectorFactory.createIaaSConnector(p); Connector jc = ConnectorFactory.createIaaSConnector(p);
jc.destroyVM(n.getId()); jc.destroyVM(n.getId());
jc.closeConnection(); jc.closeConnection();
coordinator.updateStatus(n.getName(), ComponentInstance.State.STOPPED.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(n.getName(), ComponentInstance.State.STOPPED, CloudAppDeployer.class.getName());
//old way without using mrt //old way without using mrt
//n.setStatusAsStopped(); //n.setStatusAsStopped();
} }
Expand Down
Expand Up @@ -91,10 +91,10 @@ private void allConfiguration(Map<InternalComponentInstance, InternalComponentIn


private void provisionVM(VMInstance vmi){ private void provisionVM(VMInstance vmi){
Connector c2=ConnectorFactory.createIaaSConnector(vmi.getType().getProvider()); Connector c2=ConnectorFactory.createIaaSConnector(vmi.getType().getProvider());
HashMap<String,String> result=c2.createInstance(ci); HashMap<String,Object> result=c2.createInstance(ci);
c2.closeConnection(); c2.closeConnection();
coordinator.updateStatusInternalComponent(ci.getName(), result.get("status"), CloudAppDeployer.class.getName()); coordinator.updateStatusInternalComponent(ci.getName(), result.get("status").toString(), CloudAppDeployer.class.getName());
coordinator.updateStatus(vmi.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(vmi.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
coordinator.updateIP(ci.getName(),result.get("publicAddress"),CloudAppDeployer.class.getName()); coordinator.updateIP(ci.getName(),result.get("publicAddress").toString(),CloudAppDeployer.class.getName());
} }
} }
16 changes: 8 additions & 8 deletions deployer/src/main/java/org/cloudml/deployer/Scaler.java
Expand Up @@ -203,11 +203,11 @@ public void scaleOut(VMInstance vmi, int n){
public void run() { public void run() {
//once this is done we can work in parallel //once this is done we can work in parallel
Connector c2 = ConnectorFactory.createIaaSConnector(vm.getProvider()); Connector c2 = ConnectorFactory.createIaaSConnector(vm.getProvider());
HashMap<String, String> result = c2.createInstance(ci); HashMap<String, Object> result = c2.createInstance(ci);
c2.closeConnection(); c2.closeConnection();
coordinator.updateStatusInternalComponent(ci.getName(), result.get("status"), CloudAppDeployer.class.getName()); coordinator.updateStatusInternalComponent(ci.getName(), result.get("status").toString(), CloudAppDeployer.class.getName());
coordinator.updateStatus(name, ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(name, ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
coordinator.updateIP(ci.getName(),result.get("publicAddress"),CloudAppDeployer.class.getName()); coordinator.updateIP(ci.getName(),result.get("publicAddress").toString(),CloudAppDeployer.class.getName());


dep.setAllEnvVarComponent(currentModel); dep.setAllEnvVarComponent(currentModel);


Expand Down Expand Up @@ -266,12 +266,12 @@ public void scaleOut(VMInstance vmi) {
} }


Connector c2=ConnectorFactory.createIaaSConnector(v.getProvider()); Connector c2=ConnectorFactory.createIaaSConnector(v.getProvider());
HashMap<String,String> result=c2.createInstance(ci); HashMap<String,Object> result=c2.createInstance(ci);


c2.closeConnection(); c2.closeConnection();
coordinator.updateStatusInternalComponent(ci.getName(), result.get("status"), CloudAppDeployer.class.getName()); coordinator.updateStatusInternalComponent(ci.getName(), result.get("status").toString(), CloudAppDeployer.class.getName());
coordinator.updateStatus(vmi.getName(), ComponentInstance.State.RUNNING.toString(), CloudAppDeployer.class.getName()); coordinator.updateStatus(vmi.getName(), ComponentInstance.State.RUNNING, CloudAppDeployer.class.getName());
coordinator.updateIP(ci.getName(),result.get("publicAddress"),CloudAppDeployer.class.getName()); coordinator.updateIP(ci.getName(),result.get("publicAddress").toString(),CloudAppDeployer.class.getName());


dep.setAllEnvVarComponent(currentModel); dep.setAllEnvVarComponent(currentModel);


Expand Down

0 comments on commit abc9576

Please sign in to comment.