private function onHello($message, DBServer $dbserver) { if ($dbserver->status == SERVER_STATUS::TEMPORARY) { $bundleTask = BundleTask::LoadById($dbserver->GetProperty(SERVER_PROPERTIES::SZR_IMPORTING_BUNDLE_TASK_ID)); $bundleTask->status = SERVER_SNAPSHOT_CREATION_STATUS::PENDING; $bundleTask->Log("Received Hello message from scalarizr on server. Creating image"); $bundleTask->osFamily = $message->dist->distributor; $bundleTask->osName = $message->dist->codename; $bundleTask->osVersion = $message->dist->release; if (in_array($message->dist->distributor, array('redhat', 'oel', 'scientific')) && $dbserver->platform == SERVER_PLATFORMS::EC2) { $bundleTask->bundleType = SERVER_SNAPSHOT_CREATION_TYPE::EC2_EBS_HVM; } $bundleTask->save(); } if ($dbserver->status == SERVER_STATUS::IMPORTING) { if (!$dbserver->remoteIp || !$dbserver->localIp) { if (!$dbserver->remoteIp && $message->remoteIp && $dbserver->platform != SERVER_PLATFORMS::IDCF) { $dbserver->remoteIp = $message->remoteIp; } if (!$dbserver->localIp && $message->localIp) { $dbserver->localIp = $message->localIp; } if (!$message->behaviour) { $message->behaviour = array('base'); } if ((!$dbserver->remoteIp || $dbserver->localIp == $dbserver->remoteIp) && $message->messageIpAddress != $dbserver->remoteIp) { $dbserver->remoteIp = $message->messageIpAddress; } } if (count($message->behaviour) == 1 && $message->behaviour[0] == ROLE_BEHAVIORS::CHEF) { $message->behaviour[] = ROLE_BEHAVIORS::BASE; } $dbserver->SetProperty(SERVER_PROPERTIES::SZR_IMPORTING_BEHAVIOR, @implode(",", $message->behaviour)); $dbserver->save(); $importVersion = $dbserver->GetProperty(SERVER_PROPERTIES::SZR_IMPORTING_VERSION); if ($importVersion == 2) { $dbserver->SetProperties(array(SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); } else { if ($dbserver->isOpenstack()) { $env = $dbserver->GetEnvironmentObject(); $os = $env->openstack($dbserver->platform, $dbserver->GetProperty(OPENSTACK_SERVER_PROPERTIES::CLOUD_LOCATION)); $csServer = null; $list = $os->servers->list(true); do { foreach ($list as $_tmp) { $ipaddresses = array(); if (!is_array($_tmp->addresses)) { $_tmp->addresses = (array) $_tmp->addresses; } foreach ($_tmp->addresses as $net => $addresses) { foreach ($addresses as $addr) { if ($addr->version == 4) { array_push($ipaddresses, $addr->addr); } } } if ($_tmp->accessIPv4) { array_push($ipaddresses, $_tmp->accessIPv4); } if (in_array($dbserver->localIp, $ipaddresses) || in_array($dbserver->remoteIp, $ipaddresses)) { $osServer = $_tmp; } } } while (false !== ($list = $list->getNextPage())); if (!$osServer) { $this->logger->error(sprintf("Server not found on Openstack (server_id: %s, remote_ip: %s, local_ip: %s)", $dbserver->serverId, $dbserver->remoteIp, $dbserver->localIp)); return; } $dbserver->SetProperties(array(OPENSTACK_SERVER_PROPERTIES::SERVER_ID => $osServer->id, OPENSTACK_SERVER_PROPERTIES::NAME => $osServer->name, OPENSTACK_SERVER_PROPERTIES::IMAGE_ID => $osServer->image->id, OPENSTACK_SERVER_PROPERTIES::FLAVOR_ID => $osServer->flavor->id, OPENSTACK_SERVER_PROPERTIES::HOST_ID => $osServer->hostId, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); } elseif ($dbserver->isCloudstack()) { $dbserver->SetProperties(array(CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID => $message->cloudstack->instanceId, CLOUDSTACK_SERVER_PROPERTIES::CLOUD_LOCATION => $message->cloudstack->availZone, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); } else { switch ($dbserver->platform) { case SERVER_PLATFORMS::EC2: $dbserver->SetProperties(array(EC2_SERVER_PROPERTIES::AMIID => $message->awsAmiId, EC2_SERVER_PROPERTIES::INSTANCE_ID => $message->awsInstanceId, EC2_SERVER_PROPERTIES::INSTANCE_TYPE => $message->awsInstanceType, EC2_SERVER_PROPERTIES::AVAIL_ZONE => $message->awsAvailZone, EC2_SERVER_PROPERTIES::REGION => substr($message->awsAvailZone, 0, -1), SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); break; case SERVER_PLATFORMS::EUCALYPTUS: $dbserver->SetProperties(array(EUCA_SERVER_PROPERTIES::EMIID => $message->awsAmiId, EUCA_SERVER_PROPERTIES::INSTANCE_ID => $message->awsInstanceId, EUCA_SERVER_PROPERTIES::INSTANCE_TYPE => $message->awsInstanceType, EUCA_SERVER_PROPERTIES::AVAIL_ZONE => $message->awsAvailZone, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); break; case SERVER_PLATFORMS::GCE: $dbserver->SetProperties(array(GCE_SERVER_PROPERTIES::CLOUD_LOCATION => $message->{$dbserver->platform}->cloudLocation, GCE_SERVER_PROPERTIES::SERVER_ID => $message->{$dbserver->platform}->serverId, GCE_SERVER_PROPERTIES::SERVER_NAME => $message->{$dbserver->platform}->serverName, GCE_SERVER_PROPERTIES::MACHINE_TYPE => $message->{$dbserver->platform}->machineType, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); break; case SERVER_PLATFORMS::NIMBULA: $dbserver->SetProperties(array(NIMBULA_SERVER_PROPERTIES::NAME => $message->serverName, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); break; case SERVER_PLATFORMS::RACKSPACE: $env = $dbserver->GetEnvironmentObject(); $cs = Scalr_Service_Cloud_Rackspace::newRackspaceCS($env->getPlatformConfigValue(RackspacePlatformModule::USERNAME, true, $dbserver->GetProperty(RACKSPACE_SERVER_PROPERTIES::DATACENTER)), $env->getPlatformConfigValue(RackspacePlatformModule::API_KEY, true, $dbserver->GetProperty(RACKSPACE_SERVER_PROPERTIES::DATACENTER)), $dbserver->GetProperty(RACKSPACE_SERVER_PROPERTIES::DATACENTER)); $csServer = null; $list = $cs->listServers(true); if ($list) { foreach ($list->servers as $_tmp) { if ($_tmp->addresses->public && in_array($message->remoteIp, $_tmp->addresses->public)) { $csServer = $_tmp; } } } if (!$csServer) { $this->logger->error(sprintf("Server not found on CloudServers (server_id: %s, remote_ip: %s, local_ip: %s)", $dbserver->serverId, $message->remoteIp, $message->localIp)); return; } $dbserver->SetProperties(array(RACKSPACE_SERVER_PROPERTIES::SERVER_ID => $csServer->id, RACKSPACE_SERVER_PROPERTIES::NAME => $csServer->name, RACKSPACE_SERVER_PROPERTIES::IMAGE_ID => $csServer->imageId, RACKSPACE_SERVER_PROPERTIES::FLAVOR_ID => $csServer->flavorId, RACKSPACE_SERVER_PROPERTIES::HOST_ID => $csServer->hostId, SERVER_PROPERTIES::ARCHITECTURE => $message->architecture)); break; } } } //TODO: search for existing bundle task // Bundle image $creInfo = new ServerSnapshotCreateInfo($dbserver, $dbserver->GetProperty(SERVER_PROPERTIES::SZR_IMPORTING_ROLE_NAME), SERVER_REPLACEMENT_TYPE::NO_REPLACE); $bundleTask = BundleTask::Create($creInfo); $bundleTask->osFamily = $message->dist->distributor; $bundleTask->osName = $message->dist->codename; $bundleTask->osVersion = $message->dist->release; if (in_array($message->dist->distributor, array('oel', 'redhat', 'scientific')) && $dbserver->platform == SERVER_PLATFORMS::EC2) { $bundleTask->bundleType = SERVER_SNAPSHOT_CREATION_TYPE::EC2_EBS_HVM; } $bundleTask->setDate("started"); $bundleTask->createdByEmail = $dbserver->GetProperty(SERVER_PROPERTIES::LAUNCHED_BY_EMAIL); $bundleTask->createdById = $dbserver->GetProperty(SERVER_PROPERTIES::LAUNCHED_BY_ID); if ($importVersion == 2) { $bundleTask->status = SERVER_SNAPSHOT_CREATION_STATUS::ESTABLISHING_COMMUNICATION; } $bundleTask->Save(); $dbserver->SetProperty(SERVER_PROPERTIES::SZR_IMPORTING_BUNDLE_TASK_ID, $bundleTask->id); } }