Skip to content

Commit

Permalink
implement getResourcesOfType for FlexibleEngine plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
WangLiNaruto committed Feb 23, 2024
1 parent 473b3ac commit d9ff7ba
Show file tree
Hide file tree
Showing 7 changed files with 295 additions and 2 deletions.
15 changes: 15 additions & 0 deletions plugins/flexibleengine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,21 @@
<artifactId>huaweicloud-sdk-ecs</artifactId>
<version>${huaweicloud.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.huaweicloud.sdk</groupId>
<artifactId>huaweicloud-sdk-vpc</artifactId>
<version>${huaweicloud.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.huaweicloud.sdk</groupId>
<artifactId>huaweicloud-sdk-eip</artifactId>
<version>${huaweicloud.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.huaweicloud.sdk</groupId>
<artifactId>huaweicloud-sdk-evs</artifactId>
<version>${huaweicloud.sdk.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.xpanse.modules.orchestrator.monitor.ServiceMetricsRequest;
import org.eclipse.xpanse.modules.orchestrator.servicestate.ServiceStateManageRequest;
import org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineResourceManager;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineVmStateManager;
import org.eclipse.xpanse.plugins.flexibleengine.monitor.FlexibleEngineMetricsService;
import org.eclipse.xpanse.plugins.flexibleengine.resourcehandler.FlexibleEngineTerraformResourceHandler;
Expand All @@ -45,6 +46,8 @@ public class FlexibleEngineOrchestratorPlugin implements OrchestratorPlugin {
private FlexibleEngineMetricsService flexibleEngineMetricsService;
@Resource
private FlexibleEngineVmStateManager flexibleEngineVmStateManagerService;
@Resource
private FlexibleEngineResourceManager flexibleEngineResourceManager;

@Value("${terraform.provider.flexibleengine.version}")
private String terraformFlexibleEngineVersion;
Expand All @@ -60,7 +63,7 @@ public Map<DeployerKind, DeployResourceHandler> resourceHandlers() {
@Override
public List<String> getExistingResourcesOfType(String userId, String region,
DeployResourceKind kind) {
return new ArrayList<>();
return flexibleEngineResourceManager.getExistingResourcesOfType(userId, region, kind);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@

import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.CES_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.ECS_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.EIP_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.ENDPOINT_SUFFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.EVS_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.IAM_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.PROTOCOL_HTTPS;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants.VPC_ENDPOINT_PREFIX;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineRetryStrategy.DEFAULT_DELAY_MILLIS;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineRetryStrategy.DEFAULT_RETRY_TIMES;
import static org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineRetryStrategy.ERROR_CODE_INTERNAL_SERVER_ERROR;
Expand All @@ -25,9 +28,12 @@
import com.huaweicloud.sdk.core.exception.ServiceResponseException;
import com.huaweicloud.sdk.core.http.HttpConfig;
import com.huaweicloud.sdk.ecs.v2.EcsClient;
import com.huaweicloud.sdk.eip.v2.EipClient;
import com.huaweicloud.sdk.evs.v2.EvsClient;
import com.huaweicloud.sdk.iam.v3.IamClient;
import com.huaweicloud.sdk.iam.v3.model.KeystoneListProjectsRequest;
import com.huaweicloud.sdk.iam.v3.model.KeystoneListProjectsResponse;
import com.huaweicloud.sdk.vpc.v2.VpcClient;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -68,6 +74,42 @@ public CesClient getCesClient(ICredential credential, String regionName) {
return new CesClient(hcClient);
}

/**
* Get client for service VPC.
*
* @param credential credential
* @param regionName region name
* @return client for service VPC.
*/
public VpcClient getVpcClient(ICredential credential, String regionName) {
HcClient hcClient = getHcClient(credential, VPC_ENDPOINT_PREFIX, regionName);
return new VpcClient(hcClient);
}

/**
* Get client for service EIP.
*
* @param credential credential
* @param regionName region name
* @return client for service EIP.
*/
public EipClient getEipClient(ICredential credential, String regionName) {
HcClient hcClient = getHcClient(credential, EIP_ENDPOINT_PREFIX, regionName);
return new EipClient(hcClient);
}

/**
* Get client for service EVS.
*
* @param credential credential
* @param regionName region name
* @return client for service EVS.
*/
public EvsClient getEvsClient(ICredential credential, String regionName) {
HcClient hcClient = getHcClient(credential, EVS_ENDPOINT_PREFIX, regionName);
return new EvsClient(hcClient);
}

/**
* Match retry condition.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public class FlexibleEngineConstants {
public static final String IAM_ENDPOINT_PREFIX = "iam.";
public static final String ECS_ENDPOINT_PREFIX = "ecs.";
public static final String CES_ENDPOINT_PREFIX = "ces.";
public static final String VPC_ENDPOINT_PREFIX = "vpc.";
public static final String EIP_ENDPOINT_PREFIX = "eip.";
public static final String EVS_ENDPOINT_PREFIX = "evs.";
public static final String ENDPOINT_SUFFIX = ".prod-cloud-ocb.orange-business.com";
public static final String PROJECTS_PATH = "projects";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

package org.eclipse.xpanse.plugins.flexibleengine.manage;

import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.exception.SdkException;
import com.huaweicloud.sdk.ecs.v2.EcsClient;
import com.huaweicloud.sdk.ecs.v2.model.NovaListKeypairsRequest;
import com.huaweicloud.sdk.ecs.v2.model.NovaListKeypairsResponse;
import com.huaweicloud.sdk.ecs.v2.model.NovaListKeypairsResult;
import com.huaweicloud.sdk.ecs.v2.model.NovaSimpleKeypair;
import com.huaweicloud.sdk.eip.v2.EipClient;
import com.huaweicloud.sdk.eip.v2.model.ListPublicipsRequest;
import com.huaweicloud.sdk.eip.v2.model.ListPublicipsResponse;
import com.huaweicloud.sdk.eip.v2.model.PublicipShowResp;
import com.huaweicloud.sdk.evs.v2.EvsClient;
import com.huaweicloud.sdk.evs.v2.model.ListVolumesRequest;
import com.huaweicloud.sdk.evs.v2.model.ListVolumesResponse;
import com.huaweicloud.sdk.evs.v2.model.VolumeDetail;
import com.huaweicloud.sdk.vpc.v2.VpcClient;
import com.huaweicloud.sdk.vpc.v2.model.ListSecurityGroupRulesRequest;
import com.huaweicloud.sdk.vpc.v2.model.ListSecurityGroupRulesResponse;
import com.huaweicloud.sdk.vpc.v2.model.ListSecurityGroupsRequest;
import com.huaweicloud.sdk.vpc.v2.model.ListSecurityGroupsResponse;
import com.huaweicloud.sdk.vpc.v2.model.ListSubnetsRequest;
import com.huaweicloud.sdk.vpc.v2.model.ListSubnetsResponse;
import com.huaweicloud.sdk.vpc.v2.model.ListVpcsRequest;
import com.huaweicloud.sdk.vpc.v2.model.ListVpcsResponse;
import com.huaweicloud.sdk.vpc.v2.model.SecurityGroup;
import com.huaweicloud.sdk.vpc.v2.model.SecurityGroupRule;
import com.huaweicloud.sdk.vpc.v2.model.Subnet;
import com.huaweicloud.sdk.vpc.v2.model.Vpc;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.xpanse.modules.credential.CredentialCenter;
import org.eclipse.xpanse.modules.models.common.enums.Csp;
import org.eclipse.xpanse.modules.models.credential.AbstractCredentialInfo;
import org.eclipse.xpanse.modules.models.credential.enums.CredentialType;
import org.eclipse.xpanse.modules.models.service.deploy.enums.DeployResourceKind;
import org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* FlexibleEngine Resource Manager.
*/
@Slf4j
@Component
public class FlexibleEngineResourceManager {

private final CredentialCenter credentialCenter;
private final FlexibleEngineClient flexibleEngineClient;

@Autowired
public FlexibleEngineResourceManager(
CredentialCenter credentialCenter,
FlexibleEngineClient flexibleEngineClient) {
this.credentialCenter = credentialCenter;
this.flexibleEngineClient = flexibleEngineClient;
}

/**
* List FlexibleEngine resource by the kind of ReusbaleCloudResource.
*/
public List<String> getExistingResourcesOfType(String userId,
String region, DeployResourceKind kind) {
if (kind == DeployResourceKind.VPC) {
return getVpcList(userId, region);
} else if (kind == DeployResourceKind.SUBNET) {
return getSubnetList(userId, region);
} else if (kind == DeployResourceKind.SECURITY_GROUP) {
return getSecurityGroupsList(userId, region);
} else if (kind == DeployResourceKind.SECURITY_GROUP_RULE) {
return getSecurityGroupRuleList(userId, region);
} else if (kind == DeployResourceKind.PUBLIC_IP) {
return getPublicIpList(userId, region);
} else if (kind == DeployResourceKind.VOLUME) {
return getVolumeList(userId, region);
} else if (kind == DeployResourceKind.KEYPAIR) {
return getKeyPairsList(userId, region);
} else {
return new ArrayList<>();
}
}

private List<String> getVpcList(String userId, String region) {
try {
VpcClient vpcClient = getVpcClient(userId, region);
ListVpcsRequest request = new ListVpcsRequest();
ListVpcsResponse response = vpcClient.listVpcs(request);
if (response.getHttpStatusCode() == 200) {
return response.getVpcs().stream().map(Vpc::getName).toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine vpc resources failed, error:{}", e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getSubnetList(String userId, String region) {
try {
VpcClient vpcClient = getVpcClient(userId, region);
ListSubnetsRequest request = new ListSubnetsRequest();
ListSubnetsResponse response = vpcClient.listSubnets(request);
if (response.getHttpStatusCode() == 200) {
return response.getSubnets().stream().map(Subnet::getName).toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine Subnet resources failed, error:{}", e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getSecurityGroupsList(String userId, String region) {
try {
VpcClient vpcClient = getVpcClient(userId, region);
ListSecurityGroupsRequest request = new ListSecurityGroupsRequest();
ListSecurityGroupsResponse response = vpcClient.listSecurityGroups(request);
if (response.getHttpStatusCode() == 200) {
return response.getSecurityGroups().stream().map(SecurityGroup::getName).toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine SecurityGroup resources failed, error:{}",
e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getSecurityGroupRuleList(String userId, String region) {
try {
VpcClient vpcClient = getVpcClient(userId, region);
ListSecurityGroupRulesRequest request = new ListSecurityGroupRulesRequest();
ListSecurityGroupRulesResponse response = vpcClient.listSecurityGroupRules(request);
if (response.getHttpStatusCode() == 200) {
return response.getSecurityGroupRules().stream().map(SecurityGroupRule::getId)
.toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine SecurityGroupRule resources failed, error:{}",
e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getPublicIpList(String userId, String region) {
try {
EipClient eipClient = getEipClient(userId, region);
ListPublicipsRequest request = new ListPublicipsRequest();
ListPublicipsResponse response = eipClient.listPublicips(request);
if (response.getHttpStatusCode() == 200) {
return response.getPublicips().stream().map(PublicipShowResp::getPublicIpAddress)
.toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine PublicIp resources failed, error:{}", e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getVolumeList(String userId, String region) {
try {
EvsClient evsClient = getEvsClient(userId, region);
ListVolumesRequest request = new ListVolumesRequest();
ListVolumesResponse response = evsClient.listVolumes(request);
if (response.getHttpStatusCode() == 200) {
return response.getVolumes().stream().map(VolumeDetail::getName).toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine VM resources failed, error:{}", e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private List<String> getKeyPairsList(String userId, String region) {
try {
EcsClient ecsClient = getEcsClient(userId, region);
NovaListKeypairsRequest request = new NovaListKeypairsRequest();
NovaListKeypairsResponse response = ecsClient.novaListKeypairs(request);
if (response.getHttpStatusCode() == 200) {
return response.getKeypairs().stream().map(NovaListKeypairsResult::getKeypair)
.map(NovaSimpleKeypair::getName).toList();
}
} catch (SdkException e) {
log.error("Get FlexibleEngine KeyPairs resources failed, error:{}", e.getMessage());
return new ArrayList<>();
}
return new ArrayList<>();
}

private EcsClient getEcsClient(String userId, String regionName) {
ICredential credential = getCredential(userId);
return flexibleEngineClient.getEcsClient(credential, regionName);
}

private VpcClient getVpcClient(String userId, String regionName) {
ICredential credential = getCredential(userId);
return flexibleEngineClient.getVpcClient(credential, regionName);
}

private EipClient getEipClient(String userId, String regionName) {
ICredential credential = getCredential(userId);
return flexibleEngineClient.getEipClient(credential, regionName);
}

private EvsClient getEvsClient(String userId, String regionName) {
ICredential credential = getCredential(userId);
return flexibleEngineClient.getEvsClient(credential, regionName);
}

private ICredential getCredential(String userId) {
AbstractCredentialInfo credential =
credentialCenter.getCredential(Csp.FLEXIBLE_ENGINE, CredentialType.VARIABLES,
userId);
return flexibleEngineClient.getCredential(credential);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.xpanse.modules.orchestrator.monitor.ResourceMetricsRequest;
import org.eclipse.xpanse.modules.orchestrator.monitor.ServiceMetricsRequest;
import org.eclipse.xpanse.modules.orchestrator.servicestate.ServiceStateManageRequest;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineResourceManager;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineVmStateManager;
import org.eclipse.xpanse.plugins.flexibleengine.monitor.FlexibleEngineMetricsService;
import org.eclipse.xpanse.plugins.flexibleengine.resourcehandler.FlexibleEngineTerraformResourceHandler;
Expand All @@ -43,6 +44,8 @@ class FlexibleEngineOrchestratorPluginTest {
private FlexibleEngineMetricsService mockFlexibleEngineMetricsService;
@Mock
private FlexibleEngineVmStateManager mockFlexibleEngineVmStateManagerService;
@Mock
private FlexibleEngineResourceManager flexibleEngineResourceManager;
@InjectMocks
private FlexibleEngineOrchestratorPlugin flexibleEngineOrchestratorPluginUnderTest;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.eclipse.xpanse.plugins.flexibleengine.FlexibleEngineOrchestratorPlugin;
import org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineClient;
import org.eclipse.xpanse.plugins.flexibleengine.common.FlexibleEngineConstants;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineResourceManager;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineServerManageRequestConverter;
import org.eclipse.xpanse.plugins.flexibleengine.manage.FlexibleEngineVmStateManager;
import org.eclipse.xpanse.plugins.flexibleengine.monitor.constant.FlexibleEngineMonitorConstants;
Expand All @@ -50,7 +51,7 @@
FlexibleEngineMetricsService.class, FlexibleEngineClient.class,
FlexibleEngineMonitorConstants.class, FlexibleEngineDataModelConverter.class,
CredentialCenter.class, ServiceMetricsStore.class, ServiceMetricsCacheManager.class,
FlexibleEngineTerraformResourceHandler.class})
FlexibleEngineTerraformResourceHandler.class, FlexibleEngineResourceManager.class})
class FlexibleEngineMonitorIntegrationTest {

@RegisterExtension
Expand Down

0 comments on commit d9ff7ba

Please sign in to comment.