198 lines
6.9 KiB
PHP
Executable File
198 lines
6.9 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Huawei Cloud - Création d'instances ECS
|
|
*/
|
|
|
|
require_once '/opt/wevads/vendor/autoload.php';
|
|
|
|
use HuaweiCloud\SDK\Core\Auth\BasicCredentials;
|
|
use HuaweiCloud\SDK\Core\Http\HttpConfig;
|
|
use HuaweiCloud\SDK\Ecs\V2\EcsClient;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\CreateServersRequest;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\CreateServersRequestBody;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServer;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerNic;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerSecurityGroup;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerRootVolume;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerPublicip;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerEipExtendParam;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerEipBandwidth;
|
|
use HuaweiCloud\SDK\Ecs\V2\Model\PrePaidServerEip;
|
|
use HuaweiCloud\SDK\Ims\V2\ImsClient;
|
|
use HuaweiCloud\SDK\Ims\V2\Model\ListImagesRequest;
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
|
|
|
|
$action = $_GET['action'] ?? $_POST['action'] ?? 'info';
|
|
$accountId = $_GET['account_id'] ?? $_POST['account_id'] ?? 1;
|
|
|
|
// Récupérer le compte
|
|
$stmt = $pdo->prepare("SELECT * FROM admin.huawei_accounts WHERE id = ?");
|
|
$stmt->execute([$accountId]);
|
|
$account = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$account) {
|
|
die(json_encode(['status' => 'error', 'message' => 'Account not found']));
|
|
}
|
|
|
|
// Configuration par défaut pour af-south-1
|
|
$defaultConfig = [
|
|
'vpc_id' => '9d13c500-6bd7-488a-b020-e685245e99ab',
|
|
'subnet_id' => '3a3edb6b-1426-4687-9e39-f0295e54b681',
|
|
'security_group_id' => '51d6e9f5-7ebb-447f-94fd-7e5cb0d2f16e',
|
|
'availability_zone' => 'af-south-1a'
|
|
];
|
|
|
|
function createEcsClient($account) {
|
|
$config = HttpConfig::getDefaultConfig();
|
|
$config->setIgnoreSslVerification(true);
|
|
$config->setTimeout(60);
|
|
|
|
$credentials = new BasicCredentials(
|
|
$account['application_key'],
|
|
$account['secret_key'],
|
|
$account['consumer_key']
|
|
);
|
|
|
|
return EcsClient::newBuilder()
|
|
->withHttpConfig($config)
|
|
->withEndpoint("https://ecs.{$account['region']}.myhuaweicloud.com")
|
|
->withCredentials($credentials)
|
|
->build();
|
|
}
|
|
|
|
function createImsClient($account) {
|
|
$config = HttpConfig::getDefaultConfig();
|
|
$config->setIgnoreSslVerification(true);
|
|
$config->setTimeout(30);
|
|
|
|
$credentials = new BasicCredentials(
|
|
$account['application_key'],
|
|
$account['secret_key'],
|
|
$account['consumer_key']
|
|
);
|
|
|
|
return ImsClient::newBuilder()
|
|
->withHttpConfig($config)
|
|
->withEndpoint("https://ims.{$account['region']}.myhuaweicloud.com")
|
|
->withCredentials($credentials)
|
|
->build();
|
|
}
|
|
|
|
try {
|
|
switch ($action) {
|
|
|
|
case 'list_images':
|
|
$client = createImsClient($account);
|
|
$request = new ListImagesRequest();
|
|
$request->setImagetype('gold');
|
|
$request->setPlatform('Ubuntu');
|
|
$request->setStatus('active');
|
|
$response = $client->listImages($request);
|
|
echo json_encode(['status' => 'success', 'data' => json_decode($response, true)]);
|
|
break;
|
|
|
|
case 'create':
|
|
// Paramètres de création
|
|
$serverName = $_POST['server_name'] ?? 'wevads-server-' . time();
|
|
$flavorId = $_POST['flavor_id'] ?? 's6.small.1';
|
|
$imageId = $_POST['image_id'] ?? '';
|
|
$password = $_POST['password'] ?? 'Wevads@2026!';
|
|
$count = intval($_POST['count'] ?? 1);
|
|
|
|
if (empty($imageId)) {
|
|
// Récupérer une image Ubuntu par défaut
|
|
$imsClient = createImsClient($account);
|
|
$imgRequest = new ListImagesRequest();
|
|
$imgRequest->setImagetype('gold');
|
|
$imgRequest->setPlatform('Ubuntu');
|
|
$imgRequest->setStatus('active');
|
|
$imgResponse = $imsClient->listImages($imgRequest);
|
|
$images = json_decode($imgResponse, true);
|
|
|
|
if (!empty($images['images'])) {
|
|
$imageId = $images['images'][0]['id'];
|
|
} else {
|
|
throw new Exception('No Ubuntu image found');
|
|
}
|
|
}
|
|
|
|
$client = createEcsClient($account);
|
|
|
|
// Créer la configuration du serveur
|
|
$server = new PrePaidServer();
|
|
$server->setName($serverName);
|
|
$server->setFlavorRef($flavorId);
|
|
$server->setImageRef($imageId);
|
|
$server->setVpcid($defaultConfig['vpc_id']);
|
|
$server->setAvailabilityZone($defaultConfig['availability_zone']);
|
|
$server->setAdminPass($password);
|
|
$server->setCount($count);
|
|
|
|
// NIC (réseau)
|
|
$nic = new PrePaidServerNic();
|
|
$nic->setSubnetId($defaultConfig['subnet_id']);
|
|
$server->setNics([$nic]);
|
|
|
|
// Security Group
|
|
$sg = new PrePaidServerSecurityGroup();
|
|
$sg->setId($defaultConfig['security_group_id']);
|
|
$server->setSecurityGroups([$sg]);
|
|
|
|
// Root Volume (disque)
|
|
$rootVolume = new PrePaidServerRootVolume();
|
|
$rootVolume->setVolumetype('SSD');
|
|
$rootVolume->setSize(40);
|
|
$server->setRootVolume($rootVolume);
|
|
|
|
// IP Publique (EIP)
|
|
$bandwidth = new PrePaidServerEipBandwidth();
|
|
$bandwidth->setSize(5);
|
|
$bandwidth->setSharetype('PER');
|
|
|
|
$eip = new PrePaidServerEip();
|
|
$eip->setIptype('5_bgp');
|
|
$eip->setBandwidth($bandwidth);
|
|
|
|
$publicip = new PrePaidServerPublicip();
|
|
$publicip->setEip($eip);
|
|
$server->setPublicip($publicip);
|
|
|
|
// Body de la requête
|
|
$body = new CreateServersRequestBody();
|
|
$body->setServer($server);
|
|
|
|
// Requête
|
|
$request = new CreateServersRequest();
|
|
$request->setBody($body);
|
|
|
|
$response = $client->createServers($request);
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => "Server creation started",
|
|
'data' => json_decode($response, true)
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
echo json_encode([
|
|
'status' => 'info',
|
|
'message' => 'Huawei Instance Creator',
|
|
'account' => $account['name'],
|
|
'region' => $account['region'],
|
|
'config' => $defaultConfig,
|
|
'actions' => ['list_images', 'create']
|
|
]);
|
|
}
|
|
} catch (Exception $e) {
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => $e->getMessage(),
|
|
'code' => method_exists($e, 'getErrorCode') ? $e->getErrorCode() : $e->getCode()
|
|
]);
|
|
}
|
|
|