From 9d88cef27f7ab8f6fbb24d4469c9be616ebac5d9 Mon Sep 17 00:00:00 2001 From: "hongbo.liu" Date: Thu, 14 May 2026 17:21:38 +0800 Subject: [PATCH] [vpc-dns]: support vpc router dns records Regenerate SDK actions and API artifacts for add, remove, and get VPC router DNS record operations. Resolves: ZSTAC-85249 Change-Id: I1bbbe741422d273dc8d631d6ead98405c7ad1532 --- conf/db/upgrade/V5.5.22__schema.sql | 18 +++ conf/i18n.json | 88 +++++++++++++- .../global-error-de-DE.json | 10 +- .../global-error-en_US.json | 8 ++ .../global-error-fr-FR.json | 10 +- .../global-error-id-ID.json | 10 +- .../global-error-ja-JP.json | 10 +- .../global-error-ko-KR.json | 10 +- .../global-error-ru-RU.json | 10 +- .../global-error-th-TH.json | 10 +- .../global-error-zh_CN.json | 8 ++ .../global-error-zh_TW.json | 10 +- conf/i18n/messages_en_US.properties | 32 +++++ conf/i18n/messages_zh_CN.properties | 32 +++++ .../sdk/AddDnsRecordToVpcRouterAction.java | 113 ++++++++++++++++++ .../sdk/AddDnsRecordToVpcRouterResult.java | 14 +++ .../sdk/QueryVpcRouterDnsRecordAction.java | 72 +++++++++++ .../sdk/QueryVpcRouterDnsRecordResult.java | 19 +++ .../RemoveDnsRecordFromVpcRouterAction.java | 104 ++++++++++++++++ .../RemoveDnsRecordFromVpcRouterResult.java | 14 +++ .../sdk/UpdateDnsRecordToVpcRouterAction.java | 105 ++++++++++++++++ .../sdk/UpdateDnsRecordToVpcRouterResult.java | 13 ++ .../sdk/VpcRouterDnsRecordInventory.java | 63 ++++++++++ .../org/zstack/sdk/VpcRouterVmInventory.java | 8 ++ .../java/org/zstack/testlib/ApiHelper.groovy | 101 ++++++++++++++++ .../CloudOperationsErrorCode.java | 16 +++ .../zstack/utils/network/NetworkUtils.java | 18 ++- .../zstack/utils/test/TestNetworkUtils.java | 21 ++++ 28 files changed, 937 insertions(+), 10 deletions(-) create mode 100644 sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VpcRouterDnsRecordInventory.java diff --git a/conf/db/upgrade/V5.5.22__schema.sql b/conf/db/upgrade/V5.5.22__schema.sql index f664b5f4dd1..1d1ade95077 100644 --- a/conf/db/upgrade/V5.5.22__schema.sql +++ b/conf/db/upgrade/V5.5.22__schema.sql @@ -81,3 +81,21 @@ CREATE TABLE IF NOT EXISTS `zstack`.`HaNetworkGroupGlobalConfigVersionVO` ( INSERT IGNORE INTO `zstack`.`HaNetworkGroupGlobalConfigVersionVO` (`name`, `version`) VALUES ('ha-network-group', 0); + +CREATE TABLE IF NOT EXISTS `zstack`.`VpcRouterDnsRecordVO` ( + `id` BIGINT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT, + `vpcRouterUuid` VARCHAR(32) DEFAULT NULL, + `vpcHaGroupUuid` VARCHAR(32) DEFAULT NULL, + `type` VARCHAR(16) NOT NULL DEFAULT 'A', + `domain` VARCHAR(255) NOT NULL, + `ip` VARCHAR(255) NOT NULL, + `createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + INDEX `idxVpcRouterDnsRecordVOvpcRouterUuid` (`vpcRouterUuid`), + INDEX `idxVpcRouterDnsRecordVOvpcHaGroupUuid` (`vpcHaGroupUuid`), + INDEX `idxVpcRouterDnsRecordVOtype` (`type`), + INDEX `idxVpcRouterDnsRecordVOdomain` (`domain`), + CONSTRAINT `fkVpcRouterDnsRecordVOVpcRouterVmVO` FOREIGN KEY (`vpcRouterUuid`) REFERENCES `zstack`.`VpcRouterVmVO` (`uuid`) ON DELETE CASCADE, + CONSTRAINT `fkVpcRouterDnsRecordVOVpcHaGroupVO` FOREIGN KEY (`vpcHaGroupUuid`) REFERENCES `zstack`.`VpcHaGroupVO` (`uuid`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/conf/i18n.json b/conf/i18n.json index 29c50620912..5eb92d9fcbc 100755 --- a/conf/i18n.json +++ b/conf/i18n.json @@ -35557,6 +35557,92 @@ "line": 450, "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" }, + { + "raw": "domain[%s] is not a valid format", + "en_US": "domain[{0}] is not a valid format", + "zh_CN": "domain[{0}]格式无效", + "arguments": [ + "domain" + ], + "line": 627, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "ip[%s] is not a valid IPv4 address", + "en_US": "ip[{0}] is not a valid IPv4 address", + "zh_CN": "ip[{0}]不是有效的IPv4地址", + "arguments": [ + "msg.getIp()" + ], + "line": 576, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "ip[%s] is not in private network range of vpc router[uuid:%s]", + "en_US": "ip[{0}] is not in private network range of vpc router[uuid:{1}]", + "zh_CN": "ip[{0}]不在vpc router[uuid:{1}]的私有网络范围内", + "arguments": [ + "ip", + "vpcRouterUuid" + ], + "line": 631, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "vpc router[uuid:%s] is not in state[%s]", + "en_US": "vpc router[uuid:{0}] is not in state[{1}]", + "zh_CN": "vpc router[uuid:{0}]不处于[{1}]状态", + "arguments": [ + "vpcRouterUuid", + "VmInstanceState.Running" + ], + "line": 603, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "dns record[domain:%s] has been added to vpc router[uuid:%s]", + "en_US": "dns record[domain:{0}] has been added to vpc router[uuid:{1}]", + "zh_CN": "dns record[domain:{0}]已添加到vpc router[uuid:{1}]", + "arguments": [ + "msg.getDomain()", + "msg.getUuid()" + ], + "line": 586, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "dns record count of vpc router[uuid:%s] exceeds the limit[%s]", + "en_US": "dns record count of vpc router[uuid:{0}] exceeds the limit[{1}]", + "zh_CN": "vpc router[uuid:{0}]的dns record数量超过上限[{1}]", + "arguments": [ + "msg.getUuid()", + "MAX_DNS_RECORDS_PER_VPC_ROUTER" + ], + "line": 593, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "dns record[domain:%s] is not added to vpc router[uuid:%s]", + "en_US": "dns record[domain:{0}] is not added to vpc router[uuid:{1}]", + "zh_CN": "dns record[domain:{0}]未添加到vpc router[uuid:{1}]", + "arguments": [ + "msg.getDomain()", + "msg.getUuid()" + ], + "line": 637, + "fileName": "src/main/java/org/zstack/vpc/VpcApiInterceptor.java" + }, + { + "raw": "failed to sync dns record to vpc router[uuid:%s], because: %s", + "en_US": "failed to sync dns record to vpc router[uuid:{0}], because: {1}", + "zh_CN": "同步dns record到vpc router[uuid:{0}]失败,原因:{1}", + "arguments": [ + "vrUuid", + "rsp.getError()" + ], + "line": 68, + "fileName": "src/main/java/org/zstack/vpc/VpcRouterDnsRecordBackend.java" + }, { "raw": "no ip ranges attached with l3 network[uuid:%s]", "en_US": "no ip ranges attached with l3 network[uuid:{0}]", @@ -38001,4 +38087,4 @@ "line": 166, "fileName": "src/main/java/org/zstack/sns/platform/universalsms/SNSUniversalSmsEndpoint.java" } -] \ No newline at end of file +] diff --git a/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json index 3aeec70b44c..017bb6a031e 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-de-DE.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der IP-Bereich [%s] und die Remote-Sicherheitsgruppen-UUID [%s] in Konflikt stehen", "ORG_ZSTACK_COMPUTE_HOST_10043": "VLAN-ID [%s] für Netzwerkschnittstelle [%s] auf KVM-Host [UUID: %s] konnte nicht verifiziert werden, %s", "ORG_ZSTACK_VPC_10048": "DNS-Adresse [%s] wurde zum VPC-Router [uuid:%s] hinzugefügt", + "ORG_ZSTACK_VPC_10050": "domain[%s] hat kein gültiges Format", + "ORG_ZSTACK_VPC_10051": "ip[%s] ist keine gültige IPv4-Adresse", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] befindet sich nicht im Status[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] wurde bereits zum vpc router[uuid:%s] hinzugefügt", + "ORG_ZSTACK_VPC_10054": "die Anzahl der dns record des vpc router[uuid:%s] überschreitet das Limit[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] wurde nicht zum vpc router[uuid:%s] hinzugefügt", + "ORG_ZSTACK_VPC_10056": "dns record konnte nicht mit vpc router[uuid:%s] synchronisiert werden, Grund: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] liegt nicht im privaten Netzwerkbereich von vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "Sicherheitsgruppenregel konnte nicht hinzugefügt werden, da der erlaubte CIDR [%s] mit dem Quell-IP-Bereich [%s] in Konflikt steht", "ORG_ZSTACK_VPC_10047": "VPC L3-Netzwerk muss einem VPC vRouter zugeordnet werden, bevor Operationen im Zusammenhang mit dem vRouter durchgeführt werden können (z.B. Starten/Stoppen von VMs, Erstellen von Load Balancern usw.)", "ORG_ZSTACK_ALIYUN_CORE_10022": "Snapshot-Aufgabenstatus ist beendet %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "VM[name:%s, uuid:%s] läuft auf keinem Host", "ORG_ZSTACK_AI_10164": "Modell[name:%s, uuid:%s] ist nicht für das Konto der VM freigegeben (oder öffentlich). Zum Mounten muss das Modell denselben Freigaberegeln wie die VM unterliegen.", "ORG_ZSTACK_AI_10165": "ModelCenter[uuid:%s] wurde für das Modell[name:%s, uuid:%s] nicht gefunden" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json index df3c4c42bdf..1030f6cb211 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-en_US.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-en_US.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "could not add security group rule because the IP range[%s] and remote Security Group UUID[%s] are in conflict", "ORG_ZSTACK_COMPUTE_HOST_10043": "failed to verify VLAN ID [%s] for network interface [%s] on KVM host [UUID: %s], %s", "ORG_ZSTACK_VPC_10048": "dns address [%s] has been added to VPC router [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s] is not a valid format", + "ORG_ZSTACK_VPC_10051": "ip[%s] is not a valid IPv4 address", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] is not in state[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] has been added to vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "dns record count of vpc router[uuid:%s] exceeds the limit[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] is not added to vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "failed to sync dns record to vpc router[uuid:%s], because: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] is not in private network range of vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "could not add security group rule because the allowed CIDR [%s] conflicts with the source IP range [%s]", "ORG_ZSTACK_VPC_10047": "vPC L3 network must be associated with a vPC vRouter before performing any operations related to the vRouter (such as starting/stopping VMs, creating load balancers, etc.).", "ORG_ZSTACK_ALIYUN_CORE_10022": "snapshot task status is finished %s", diff --git a/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json index b1ac5f6ba2c..f7baffaa79d 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-fr-FR.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "impossible d'ajouter une règle de groupe de sécurité car la plage d'adresses IP[%s] et l'UUID du groupe de sécurité distant[%s] sont en conflit", "ORG_ZSTACK_COMPUTE_HOST_10043": "échec de la vérification de l'ID VLAN [%s] pour l'interface réseau [%s] sur l'hôte KVM [UUID: %s], %s", "ORG_ZSTACK_VPC_10048": "l'adresse DNS [%s] a été ajoutée au routeur VPC [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s] n'est pas dans un format valide", + "ORG_ZSTACK_VPC_10051": "ip[%s] n'est pas une adresse IPv4 valide", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] n'est pas dans l'état[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] a été ajouté au vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "le nombre de dns record du vpc router[uuid:%s] dépasse la limite[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] n'est pas ajouté au vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "échec de la synchronisation du dns record vers le vpc router[uuid:%s], raison : %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] n'est pas dans la plage du réseau privé du vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "impossible d'ajouter une règle de groupe de sécurité car le CIDR autorisé [%s] est en conflit avec la plage d'adresses IP source [%s]", "ORG_ZSTACK_VPC_10047": "le réseau L3 VPC doit être associé à un vRouter VPC avant d'effectuer toute opération liée au vRouter (comme démarrer/arrêter des VMs, créer des équilibreurs de charge, etc.)", "ORG_ZSTACK_ALIYUN_CORE_10022": "le statut de la tâche de capture d'écran est terminé %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "La VM[nom:%s, uuid:%s] ne s'exécute sur aucun hôte", "ORG_ZSTACK_AI_10164": "Le modèle[nom:%s, uuid:%s] n'est pas partagé avec le compte propriétaire de cette VM (ni public). Le montage exige que le modèle soit accessible selon les mêmes règles de partage.", "ORG_ZSTACK_AI_10165": "ModelCenter[uuid:%s] introuvable pour le modèle[nom:%s, uuid:%s]" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json index a1daa8a6768..0b6b1944124 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-id-ID.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "tidak dapat menambahkan aturan grup keamanan karena rentang IP[%s] dan UUID Grup Keamanan Jarak Jauh[%s] bentrok", "ORG_ZSTACK_COMPUTE_HOST_10043": "gagal memverifikasi VLAN ID [%s] untuk antarmuka jaringan [%s] pada host KVM [UUID: %s], %s", "ORG_ZSTACK_VPC_10048": "alamat dns [%s] telah ditambahkan ke router VPC [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s] bukan format yang valid", + "ORG_ZSTACK_VPC_10051": "ip[%s] bukan alamat IPv4 yang valid", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] tidak dalam status[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] telah ditambahkan ke vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "jumlah dns record pada vpc router[uuid:%s] melebihi batas[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] belum ditambahkan ke vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "gagal menyinkronkan dns record ke vpc router[uuid:%s], karena: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] tidak berada dalam rentang jaringan privat vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "tidak dapat menambahkan aturan grup keamanan karena CIDR yang diizinkan [%s] bentrok dengan rentang IP sumber [%s]", "ORG_ZSTACK_VPC_10047": "jaringan L3 vPC harus dikaitkan dengan vRouter vPC sebelum melakukan operasi terkait vRouter (seperti memulai/menghentikan VM, membuat load balancer, dll.)", "ORG_ZSTACK_ALIYUN_CORE_10022": "status tugas snapshot sudah selesai %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "VM[nama:%s, uuid:%s] tidak berjalan pada host manapun", "ORG_ZSTACK_AI_10164": "Model[nama:%s, uuid:%s] tidak dibagikan ke akun pemilik VM ini (atau ke publik). Mount membutuhkan model yang dapat diakses dengan aturan berbagi yang sama dengan VM.", "ORG_ZSTACK_AI_10165": "ModelCenter[uuid:%s] tidak ditemukan untuk Model[nama:%s, uuid:%s]" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json index a1ede2a0151..80fd0f214ca 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ja-JP.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "IP範囲[%s]とリモートセキュリティグループUUID[%s]が競合しているため、セキュリティグループルールを追加できませんでした", "ORG_ZSTACK_COMPUTE_HOST_10043": "KVMホスト[UUID: %s]上のネットワークインターフェース[%s]のVLAN ID [%s]の確認に失敗しました。%s", "ORG_ZSTACK_VPC_10048": "DNSアドレス[%s]はVPCルータ[uuid:%s]に追加済みです", + "ORG_ZSTACK_VPC_10050": "domain[%s]は有効な形式ではありません", + "ORG_ZSTACK_VPC_10051": "ip[%s]は有効なIPv4アドレスではありません", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s]は状態[%s]ではありません", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s]はvpc router[uuid:%s]に追加済みです", + "ORG_ZSTACK_VPC_10054": "vpc router[uuid:%s]のdns record数が上限[%s]を超えています", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s]はvpc router[uuid:%s]に追加されていません", + "ORG_ZSTACK_VPC_10056": "dns recordをvpc router[uuid:%s]に同期できませんでした。理由: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s]はvpc router[uuid:%s]のプライベートネットワーク範囲内にありません", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "許可されたCIDR [%s]が送信元IP範囲[%s]と競合しているため、セキュリティグループルールを追加できませんでした", "ORG_ZSTACK_VPC_10047": "vPC L3ネットワークは、vRouterに関連する操作(VMの起動/停止、ロードバランサーの作成など)を実行する前に、vPC vRouterに関連付けられている必要があります", "ORG_ZSTACK_ALIYUN_CORE_10022": "スナップショットタスクのステータスは完了しました %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "VM「%s」(UUID: %s) はどのホストでも実行されていません", "ORG_ZSTACK_AI_10164": "モデル「%s」(UUID: %s) は VM の所属アカウントに共有されていない(または公開されていない)ため、マウントできません。", "ORG_ZSTACK_AI_10165": "モデルセンター (UUID: %s) が見つかりません(関連モデル: 「%s」UUID: %s)" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json index 7ad24c14f1c..25fa61d5699 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ko-KR.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "IP 범위[%s]와(과) 원격 보안 그룹 UUID[%s]가 충돌하여 보안 그룹 규칙을 추가할 수 없습니다.", "ORG_ZSTACK_COMPUTE_HOST_10043": "KVM 호스트 [UUID: %s]에서 네트워크 인터페이스 [%s]에 대한 VLAN ID [%s]를 확인할 실패했습니다, %s", "ORG_ZSTACK_VPC_10048": "DNS 주소 [%s]가 VPC 라우터 [uuid:%s]에 추가되었습니다.", + "ORG_ZSTACK_VPC_10050": "domain[%s]은 유효한 형식이 아닙니다", + "ORG_ZSTACK_VPC_10051": "ip[%s]은 유효한 IPv4 주소가 아닙니다", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s]이(가) 상태[%s]가 아닙니다", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s]이(가) vpc router[uuid:%s]에 이미 추가되었습니다", + "ORG_ZSTACK_VPC_10054": "vpc router[uuid:%s]의 dns record 수가 제한[%s]을 초과했습니다", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s]이(가) vpc router[uuid:%s]에 추가되어 있지 않습니다", + "ORG_ZSTACK_VPC_10056": "dns record을 vpc router[uuid:%s]에 동기화하지 못했습니다. 원인: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s]은 vpc router[uuid:%s]의 private network 범위에 없습니다", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "허용된 CIDR [%s]가 소스 IP 범위 [%s]와(과) 충돌하여 보안 그룹 규칙을 추가할 수 없습니다.", "ORG_ZSTACK_VPC_10047": "vPC L3 네트워크는 vRouter 관련 작업(예: VM 시작/중지, 로드 밸런서 생성 등)을 수행하기 전에 vPC vRouter와 연결되어야 합니다.", "ORG_ZSTACK_ALIYUN_CORE_10022": "스냅샷 작업 상태가 %s로 완료되었습니다", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "VM「%s」(UUID: %s)는 어떤 호스트에서도 실행되고 있지 않습니다", "ORG_ZSTACK_AI_10164": "모델「%s」(UUID: %s)이(가) 이 VM이 속한 계정에 공유되어 있지 않습니다(또는 공개되지 않음). 마운트하려면 동일한 공유 규칙을 따르세요.", "ORG_ZSTACK_AI_10165": "모델 센터 (UUID: %s)를 찾을 수 없습니다 (관련 모델: 「%s」UUID: %s)" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json index 7a9891325cf..b081a83d74d 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-ru-RU.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "невозможно добавить правило группы безопасности, поскольку IP диапазон[%s] и UUID удаленной группы безопасности[%s] конфликтуют", "ORG_ZSTACK_COMPUTE_HOST_10043": "не удалось проверить VLAN ID [%s] для сетевого интерфейса [%s] на KVM хосте [UUID: %s], %s", "ORG_ZSTACK_VPC_10048": "адрес DNS [%s] был добавлен к VPC маршрутизатору [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s] имеет недопустимый формат", + "ORG_ZSTACK_VPC_10051": "ip[%s] не является допустимым IPv4-адресом", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] не находится в состоянии[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] уже добавлена к vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "количество dns record для vpc router[uuid:%s] превышает предел[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] не добавлена к vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "не удалось синхронизировать dns record с vpc router[uuid:%s], причина: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] не входит в диапазон частной сети vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "невозможно добавить правило группы безопасности, поскольку разрешенный CIDR [%s] конфликтует с диапазоном исходных IP [%s]", "ORG_ZSTACK_VPC_10047": "vPC L3 сеть должна быть связана с vPC vRouter перед выполнением любых операций, связанных с vRouter (таких как запуск/остановка ВМ, создание балансировщиков нагрузки и т.д.).", "ORG_ZSTACK_ALIYUN_CORE_10022": "статус задачи моментального снимка завершен %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "ВМ[имя:%s, uuid:%s] не запущена ни на одном хосте", "ORG_ZSTACK_AI_10164": "Модель[имя:%s, uuid:%s] не предоставлена аккаунту-владельцу этой ВМ (и не является публичной). Для монтирования модель должна быть доступна по тем же правилам, что и ВМ.", "ORG_ZSTACK_AI_10165": "ModelCenter[uuid:%s] не найден для модели[имя:%s, uuid:%s]" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json index 3d8a70d36ad..472353d0bed 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-th-TH.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจากช่วง IP[%s] และ UUID ของกลุ่มความปลอดภัยระยะไกล[%s] ขัดแย้งกัน", "ORG_ZSTACK_COMPUTE_HOST_10043": "ล้มเหลวในการตรวจสอบ VLAN ID [%s] สำหรับ network interface [%s] บน KVM host [UUID: %s], %s", "ORG_ZSTACK_VPC_10048": "ที่อยู่ dns [%s] ได้ถูกเพิ่มไปยัง VPC router แล้ว [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s] ไม่ใช่รูปแบบที่ถูกต้อง", + "ORG_ZSTACK_VPC_10051": "ip[%s] ไม่ใช่ที่อยู่ IPv4 ที่ถูกต้อง", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s] ไม่ได้อยู่ในสถานะ[%s]", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s] ถูกเพิ่มไปยัง vpc router[uuid:%s] แล้ว", + "ORG_ZSTACK_VPC_10054": "จำนวน dns record ของ vpc router[uuid:%s] เกินขีดจำกัด[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s] ยังไม่ได้ถูกเพิ่มไปยัง vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "ซิงค์ dns record ไปยัง vpc router[uuid:%s] ไม่สำเร็จ เนื่องจาก: %s", + "ORG_ZSTACK_VPC_10057": "ip[%s] ไม่อยู่ในช่วงเครือข่ายส่วนตัวของ vpc router[uuid:%s]", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "ไม่สามารถเพิ่มกฎกลุ่มความปลอดภัยเนื่องจาก CIDR ที่อนุญาต [%s] ขัดแย้งกับช่วง IP ต้นทาง [%s]", "ORG_ZSTACK_VPC_10047": "เครือข่าย L3 ของ VPC ต้องเชื่อมโยงกับ vRouter ของ VPC ก่อนดำเนินการใดๆ ที่เกี่ยวข้องกับ vRouter (เช่น เริ่ม/หยุด VMs, สร้", "ORG_ZSTACK_ALIYUN_CORE_10022": "snapshot task status is finished %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "VM「%s」(UUID: %s) ไม่ได้ทำงานอยู่บนโฮสต์ใด ๆ", "ORG_ZSTACK_AI_10164": "โมเดล「%s」(UUID: %s) ไม่ได้แชร์ให้บัญชีของ VM นี้ (หรือสาธารณะ) การ mount ต้องเข้าถึงได้ตามกฎการแชร์เดียวกับ VM", "ORG_ZSTACK_AI_10165": "ไม่พบ ModelCenter[uuid:%s] สำหรับโมเดล[name:%s, uuid:%s]" -} \ No newline at end of file +} diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json index 1400aefd860..0c4fceda175 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_CN.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "无法添加安全组规则,因为 IP 范围[%s]和 remoteSecurityGroupUuid[%s]存在冲突", "ORG_ZSTACK_COMPUTE_HOST_10043": "失败在KVM宿主机[uuid: %s]上检查网络接口[%s]的VLAN ID[%s]时:%s", "ORG_ZSTACK_VPC_10048": "dns 地址 [%s] 已添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s]格式无效", + "ORG_ZSTACK_VPC_10051": "ip[%s]不是有效的IPv4地址", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s]不处于[%s]状态", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s]已添加到vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "vpc router[uuid:%s]的dns record数量超过上限[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s]未添加到vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "同步dns record到vpc router[uuid:%s]失败,原因:%s", + "ORG_ZSTACK_VPC_10057": "ip[%s]不在vpc router[uuid:%s]的私有网络范围内", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "无法添加安全组规则,因为允许的CIDR[%s]和源IP范围[%s]存在冲突", "ORG_ZSTACK_VPC_10047": "VPC L3网络必须先绑定一个VPC路由器,才能执行与路由器相关的操作(如启动/停止VM、创建负载均衡等)。", "ORG_ZSTACK_ALIYUN_CORE_10022": "快照任务状态已完成 %s", diff --git a/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json index e4519a55611..964587396ba 100644 --- a/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json +++ b/conf/i18n/globalErrorCodeMapping/global-error-zh_TW.json @@ -327,6 +327,14 @@ "ORG_ZSTACK_NETWORK_SECURITYGROUP_10105": "無法添加安全组規则,因为 IP 范围[%s]和 remoteSecurityGroupUuid[%s]儲在冲突", "ORG_ZSTACK_COMPUTE_HOST_10043": "失敗在KVM宿主機[uuid: %s]上检查网络接口[%s]的VLAN ID[%s]时:%s", "ORG_ZSTACK_VPC_10048": "dns 地址 [%s] 已添加到 vpc 路由器 [uuid:%s]", + "ORG_ZSTACK_VPC_10050": "domain[%s]格式無效", + "ORG_ZSTACK_VPC_10051": "ip[%s]不是有效的IPv4地址", + "ORG_ZSTACK_VPC_10052": "vpc router[uuid:%s]不處於[%s]狀態", + "ORG_ZSTACK_VPC_10053": "dns record[domain:%s]已添加到vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10054": "vpc router[uuid:%s]的dns record數量超過上限[%s]", + "ORG_ZSTACK_VPC_10055": "dns record[domain:%s]未添加到vpc router[uuid:%s]", + "ORG_ZSTACK_VPC_10056": "同步dns record到vpc router[uuid:%s]失敗,原因:%s", + "ORG_ZSTACK_VPC_10057": "ip[%s]不在vpc router[uuid:%s]的私有網路範圍內", "ORG_ZSTACK_NETWORK_SECURITYGROUP_10107": "無法添加安全组規则,因为允許的CIDR[%s]和源IP范围[%s]儲在冲突", "ORG_ZSTACK_VPC_10047": "VPC L3网络必須先綁定一個VPC路由器,才能執行与路由器相關的操作(如啟動/停止VM、創建负载均衡等)。", "ORG_ZSTACK_ALIYUN_CORE_10022": "快照任務状态已完成 %s", @@ -4730,4 +4738,4 @@ "ORG_ZSTACK_AI_10163": "虛擬機「%s」(UUID: %s) 未運行在任何主機上", "ORG_ZSTACK_AI_10164": "模型「%s」(UUID: %s) 與該虛擬機所屬帳戶的共享規則不匹配,無法掛載。\n請確認模型已共享給該帳戶或設為公開。", "ORG_ZSTACK_AI_10165": "模型中心 (UUID: %s) 未找到(關聯模型: 「%s」UUID: %s)。\n請檢查模型中心是否已被刪除。" -} \ No newline at end of file +} diff --git a/conf/i18n/messages_en_US.properties b/conf/i18n/messages_en_US.properties index 8148dcd6869..350a8a4297c 100755 --- a/conf/i18n/messages_en_US.properties +++ b/conf/i18n/messages_en_US.properties @@ -14058,6 +14058,38 @@ No\ VNC\ ports\ available = No VNC ports available # args: msg.getDns() dns[%s]\ is\ not\ a\ IP\ address = dns[{0}] is not a IP address +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:627 +# args: domain +domain[%s]\ is\ not\ a\ valid\ format = domain[{0}] is not a valid format + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:576 +# args: msg.getIp() +ip[%s]\ is\ not\ a\ valid\ IPv4\ address = ip[{0}] is not a valid IPv4 address + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:631 +# args: ip, vpcRouterUuid +ip[%s]\ is\ not\ in\ private\ network\ range\ of\ vpc\ router[uuid\:%s] = ip[{0}] is not in private network range of vpc router[uuid:{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:603 +# args: vpcRouterUuid, VmInstanceState.Running +vpc\ router[uuid\:%s]\ is\ not\ in\ state[%s] = vpc router[uuid:{0}] is not in state[{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:586 +# args: msg.getDomain(), msg.getUuid() +dns\ record[domain\:%s]\ has\ been\ added\ to\ vpc\ router[uuid\:%s] = dns record[domain:{0}] has been added to vpc router[uuid:{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:593 +# args: msg.getUuid(), MAX_DNS_RECORDS_PER_VPC_ROUTER +dns\ record\ count\ of\ vpc\ router[uuid\:%s]\ exceeds\ the\ limit[%s] = dns record count of vpc router[uuid:{0}] exceeds the limit[{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:637 +# args: msg.getDomain(), msg.getUuid() +dns\ record[domain\:%s]\ is\ not\ added\ to\ vpc\ router[uuid\:%s] = dns record[domain:{0}] is not added to vpc router[uuid:{1}] + +# at: src/main/java/org/zstack/vpc/VpcRouterDnsRecordBackend.java:68 +# args: vrUuid,rsp.getError() +failed\ to\ sync\ dns\ record\ to\ vpc\ router[uuid\:%s],\ because\:\ %s = failed to sync dns record to vpc router[uuid:{0}], because: {1} + # at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:338 # args: l3NetworkVO.getUuid() no\ ip\ ranges\ attached\ with\ l3\ network[uuid\:%s] = no ip ranges attached with l3 network[uuid:{0}] diff --git a/conf/i18n/messages_zh_CN.properties b/conf/i18n/messages_zh_CN.properties index 8bc97465306..60e4be3223e 100755 --- a/conf/i18n/messages_zh_CN.properties +++ b/conf/i18n/messages_zh_CN.properties @@ -14058,6 +14058,38 @@ No\ VNC\ ports\ available = 未找到可用的VNC端口 # args: msg.getDns() dns[%s]\ is\ not\ a\ IP\ address = dns地址[{0}]不是有效的IP地址 +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:627 +# args: domain +domain[%s]\ is\ not\ a\ valid\ format = domain[{0}]格式无效 + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:576 +# args: msg.getIp() +ip[%s]\ is\ not\ a\ valid\ IPv4\ address = ip[{0}]不是有效的IPv4地址 + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:631 +# args: ip, vpcRouterUuid +ip[%s]\ is\ not\ in\ private\ network\ range\ of\ vpc\ router[uuid\:%s] = ip[{0}]不在vpc router[uuid:{1}]的私有网络范围内 + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:603 +# args: vpcRouterUuid, VmInstanceState.Running +vpc\ router[uuid\:%s]\ is\ not\ in\ state[%s] = vpc router[uuid:{0}]不处于[{1}]状态 + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:586 +# args: msg.getDomain(), msg.getUuid() +dns\ record[domain\:%s]\ has\ been\ added\ to\ vpc\ router[uuid\:%s] = dns record[domain:{0}]已添加到vpc router[uuid:{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:593 +# args: msg.getUuid(), MAX_DNS_RECORDS_PER_VPC_ROUTER +dns\ record\ count\ of\ vpc\ router[uuid\:%s]\ exceeds\ the\ limit[%s] = vpc router[uuid:{0}]的dns record数量超过上限[{1}] + +# at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:637 +# args: msg.getDomain(), msg.getUuid() +dns\ record[domain\:%s]\ is\ not\ added\ to\ vpc\ router[uuid\:%s] = dns record[domain:{0}]未添加到vpc router[uuid:{1}] + +# at: src/main/java/org/zstack/vpc/VpcRouterDnsRecordBackend.java:68 +# args: vrUuid,rsp.getError() +failed\ to\ sync\ dns\ record\ to\ vpc\ router[uuid\:%s],\ because\:\ %s = 同步dns record到vpc router[uuid:{0}]失败,原因:{1} + # at: src/main/java/org/zstack/vpc/VpcApiInterceptor.java:338 # args: l3NetworkVO.getUuid() no\ ip\ ranges\ attached\ with\ l3\ network[uuid\:%s] = 在三层网络[uuid:{0}]上没有IP范围被绑定 diff --git a/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterAction.java new file mode 100644 index 00000000000..e02245cb126 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterAction.java @@ -0,0 +1,113 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class AddDnsRecordToVpcRouterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.AddDnsRecordToVpcRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String domain; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String ip; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.AddDnsRecordToVpcRouterResult value = res.getResult(org.zstack.sdk.AddDnsRecordToVpcRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.AddDnsRecordToVpcRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/vpc/virtual-routers/{uuid}/dns-record"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterResult.java b/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterResult.java new file mode 100644 index 00000000000..390edf29c7b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/AddDnsRecordToVpcRouterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VpcRouterDnsRecordInventory; + +public class AddDnsRecordToVpcRouterResult { + public VpcRouterDnsRecordInventory inventory; + public void setInventory(VpcRouterDnsRecordInventory inventory) { + this.inventory = inventory; + } + public VpcRouterDnsRecordInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordAction.java new file mode 100644 index 00000000000..ab49c2e2515 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordAction.java @@ -0,0 +1,72 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryVpcRouterDnsRecordAction extends QueryAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.QueryVpcRouterDnsRecordResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryVpcRouterDnsRecordResult value = res.getResult(org.zstack.sdk.QueryVpcRouterDnsRecordResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryVpcRouterDnsRecordResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/vpc/virtual-routers/dns-records"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordResult.java b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordResult.java new file mode 100644 index 00000000000..9132315384a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVpcRouterDnsRecordResult.java @@ -0,0 +1,19 @@ +package org.zstack.sdk; + +public class QueryVpcRouterDnsRecordResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } +} diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterAction.java new file mode 100644 index 00000000000..3f816e321dc --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class RemoveDnsRecordFromVpcRouterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.RemoveDnsRecordFromVpcRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String domain; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.RemoveDnsRecordFromVpcRouterResult value = res.getResult(org.zstack.sdk.RemoveDnsRecordFromVpcRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.RemoveDnsRecordFromVpcRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "DELETE"; + info.path = "/vpc/virtual-routers/{uuid}/dns-record"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterResult.java b/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterResult.java new file mode 100644 index 00000000000..9902fc1307e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/RemoveDnsRecordFromVpcRouterResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class RemoveDnsRecordFromVpcRouterResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterAction.java new file mode 100644 index 00000000000..38585427150 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterAction.java @@ -0,0 +1,105 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateDnsRecordToVpcRouterAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.UpdateDnsRecordToVpcRouterResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String domain; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = false, noTrim = false) + public java.lang.String ip; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.UpdateDnsRecordToVpcRouterResult value = res.getResult(org.zstack.sdk.UpdateDnsRecordToVpcRouterResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateDnsRecordToVpcRouterResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "PUT"; + info.path = "/vpc/virtual-routers/{uuid}/dns-record"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateDnsRecordToVpcRouter"; + return info; + } +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterResult.java new file mode 100644 index 00000000000..789da829476 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateDnsRecordToVpcRouterResult.java @@ -0,0 +1,13 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VpcRouterDnsRecordInventory; + +public class UpdateDnsRecordToVpcRouterResult { + public VpcRouterDnsRecordInventory inventory; + public void setInventory(VpcRouterDnsRecordInventory inventory) { + this.inventory = inventory; + } + public VpcRouterDnsRecordInventory getInventory() { + return this.inventory; + } +} diff --git a/sdk/src/main/java/org/zstack/sdk/VpcRouterDnsRecordInventory.java b/sdk/src/main/java/org/zstack/sdk/VpcRouterDnsRecordInventory.java new file mode 100644 index 00000000000..aa5e654572b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VpcRouterDnsRecordInventory.java @@ -0,0 +1,63 @@ +package org.zstack.sdk; + + + +public class VpcRouterDnsRecordInventory { + + public java.lang.Long id; + public void setId(java.lang.Long id) { + this.id = id; + } + public java.lang.Long getId() { + return this.id; + } + + public java.lang.String vpcRouterUuid; + public void setVpcRouterUuid(java.lang.String vpcRouterUuid) { + this.vpcRouterUuid = vpcRouterUuid; + } + public java.lang.String getVpcRouterUuid() { + return this.vpcRouterUuid; + } + + public java.lang.String vpcHaGroupUuid; + public void setVpcHaGroupUuid(java.lang.String vpcHaGroupUuid) { + this.vpcHaGroupUuid = vpcHaGroupUuid; + } + public java.lang.String getVpcHaGroupUuid() { + return this.vpcHaGroupUuid; + } + + public java.lang.String domain; + public void setDomain(java.lang.String domain) { + this.domain = domain; + } + public java.lang.String getDomain() { + return this.domain; + } + + public java.lang.String ip; + public void setIp(java.lang.String ip) { + this.ip = ip; + } + public java.lang.String getIp() { + return this.ip; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VpcRouterVmInventory.java b/sdk/src/main/java/org/zstack/sdk/VpcRouterVmInventory.java index e67e8eec508..bd59025ed5f 100644 --- a/sdk/src/main/java/org/zstack/sdk/VpcRouterVmInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/VpcRouterVmInventory.java @@ -12,6 +12,14 @@ public java.util.List getDns() { return this.dns; } + public java.util.List dnsRecords; + public void setDnsRecords(java.util.List dnsRecords) { + this.dnsRecords = dnsRecords; + } + public java.util.List getDnsRecords() { + return this.dnsRecords; + } + public java.util.List haRef; public void setHaRef(java.util.List haRef) { this.haRef = haRef; diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 93ba3d61d03..229b1bd9ff2 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -57693,5 +57693,106 @@ abstract class ApiHelper { } } + def addDnsRecordToVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.AddDnsRecordToVpcRouterAction.class) Closure c) { + def a = new org.zstack.sdk.AddDnsRecordToVpcRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def removeDnsRecordFromVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.RemoveDnsRecordFromVpcRouterAction.class) Closure c) { + def a = new org.zstack.sdk.RemoveDnsRecordFromVpcRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def updateDnsRecordToVpcRouter(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateDnsRecordToVpcRouterAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateDnsRecordToVpcRouterAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def getVpcRouterDnsRecord(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVpcRouterDnsRecordAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVpcRouterDnsRecordAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } } diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index 623abb2face..8fc455611b5 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -510,6 +510,22 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_VPC_10049 = "ORG_ZSTACK_VPC_10049"; + public static final String ORG_ZSTACK_VPC_10050 = "ORG_ZSTACK_VPC_10050"; + + public static final String ORG_ZSTACK_VPC_10051 = "ORG_ZSTACK_VPC_10051"; + + public static final String ORG_ZSTACK_VPC_10052 = "ORG_ZSTACK_VPC_10052"; + + public static final String ORG_ZSTACK_VPC_10053 = "ORG_ZSTACK_VPC_10053"; + + public static final String ORG_ZSTACK_VPC_10054 = "ORG_ZSTACK_VPC_10054"; + + public static final String ORG_ZSTACK_VPC_10055 = "ORG_ZSTACK_VPC_10055"; + + public static final String ORG_ZSTACK_VPC_10056 = "ORG_ZSTACK_VPC_10056"; + + public static final String ORG_ZSTACK_VPC_10057 = "ORG_ZSTACK_VPC_10057"; + public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10000 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10000"; public static final String ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10001 = "ORG_ZSTACK_TEST_INTEGRATION_CORE_CLOUDBUS_10001"; diff --git a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java index 3a7859fec8d..2697c25e75e 100755 --- a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java @@ -25,6 +25,9 @@ public class NetworkUtils { private static final CLogger logger = Utils.getLogger(NetworkUtils.class); + private static final int MAX_DOMAIN_NAME_LENGTH = 253; + private static final int MAX_DOMAIN_NAME_LABEL_LENGTH = 63; + private static final Map validNetmasks = new HashMap(); private static final Random random = new Random(); @@ -75,6 +78,20 @@ public static boolean isHostname(String hostname) { return matcher.matches(); } + public static boolean isDomainName(String domainName) { + if (domainName == null || domainName.length() > MAX_DOMAIN_NAME_LENGTH || !isHostname(domainName)) { + return false; + } + + for (String label : domainName.split("\\.")) { + if (label.length() > MAX_DOMAIN_NAME_LABEL_LENGTH) { + return false; + } + } + + return true; + } + public static boolean isIpv4Address(String ip) { if (ip == null) { return false; @@ -972,4 +989,3 @@ public static int compareIpv4Address(String ip1, String ip2) { return diff > 0 ? 1 : diff == 0 ? 0 : -1; } } - diff --git a/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java index f1cc86f81bd..f11ceac1531 100644 --- a/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java +++ b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtils.java @@ -4,6 +4,9 @@ import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; import org.zstack.utils.network.NetworkUtils; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + public class TestNetworkUtils { @Test public void test() { @@ -36,4 +39,22 @@ public void test() { hname = "hostname.zstack.org"; System.out.println(String.format("%s %s", hname, NetworkUtils.isHostname(hname))); } + + @Test + public void testDomainName() { + assertTrue(NetworkUtils.isDomainName("db.prod.local")); + assertTrue(NetworkUtils.isDomainName("app-1.internal")); + assertTrue(NetworkUtils.isDomainName("localhost")); + + assertFalse(NetworkUtils.isDomainName(null)); + assertFalse(NetworkUtils.isDomainName("*.app.local")); + assertFalse(NetworkUtils.isDomainName("db_prod.local")); + assertFalse(NetworkUtils.isDomainName("中文.local")); + assertFalse(NetworkUtils.isDomainName(".prod.local")); + assertFalse(NetworkUtils.isDomainName("prod.local.")); + assertFalse(NetworkUtils.isDomainName("-db.prod.local")); + assertFalse(NetworkUtils.isDomainName("db-.prod.local")); + assertFalse(NetworkUtils.isDomainName(new String(new char[64]).replace('\0', 'a') + ".local")); + assertFalse(NetworkUtils.isDomainName(new String(new char[254]).replace('\0', 'a'))); + } }