Files
wevads-platform/scripts/huawei-create-instance.php
2026-02-26 04:53:11 +01:00

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()
]);
}