Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/iaas/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
dependencies {
implementation project (':services:iaas')
implementation project (':services:resourcemanager')
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
package cloud.stackit.sdk.iaas.examples;

import cloud.stackit.sdk.core.exception.ApiException;
import cloud.stackit.sdk.iaas.v2alpha1api.api.IaasApi;
import cloud.stackit.sdk.iaas.v2alpha1api.model.AddVPCRoutingTablePayload;
import cloud.stackit.sdk.iaas.v2alpha1api.model.AddVPCStaticRoutePayload;
import cloud.stackit.sdk.iaas.v2alpha1api.model.AddVPCStaticRoutePayloadDestination;
import cloud.stackit.sdk.iaas.v2alpha1api.model.AddVPCStaticRoutePayloadNexthop;
import cloud.stackit.sdk.iaas.v2alpha1api.model.CreateVPCPayload;
import cloud.stackit.sdk.iaas.v2alpha1api.model.CreateVPCRegionPayload;
import cloud.stackit.sdk.iaas.v2alpha1api.model.DestinationCIDRv4;
import cloud.stackit.sdk.iaas.v2alpha1api.model.NetworkRangeIPv4Request;
import cloud.stackit.sdk.iaas.v2alpha1api.model.NexthopInternet;
import cloud.stackit.sdk.iaas.v2alpha1api.model.RegionalVPC;
import cloud.stackit.sdk.iaas.v2alpha1api.model.Route;
import cloud.stackit.sdk.iaas.v2alpha1api.model.VPC;
import cloud.stackit.sdk.iaas.v2alpha1api.model.VPCNetworkRange;
import cloud.stackit.sdk.iaas.v2alpha1api.model.VPCRoutingTable;
import cloud.stackit.sdk.resourcemanager.v0api.api.ResourceManagerApi;
import cloud.stackit.sdk.resourcemanager.v0api.model.CreateProjectPayload;
import cloud.stackit.sdk.resourcemanager.v0api.model.Member;
import cloud.stackit.sdk.resourcemanager.v0api.model.Project;
import cloud.stackit.sdk.resourcemanager.v0api.wait.ResourcemanagerWait;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class IaaSVPCExample {
public static void main(String[] args) throws IOException {
/*
* Credentials are read from the credentialsFile in `~/.stackit/credentials.json` or the env
* STACKIT_SERVICE_ACCOUNT_KEY_PATH / STACKIT_SERVICE_ACCOUNT_KEY
* */
IaasApi iaasApi = new IaasApi();
ResourceManagerApi resourceManagerApi = new ResourceManagerApi();

String region = "eu01";
String parentContainerId = System.getenv("STACKIT_CONTAINER_ID");
String ownerEmail = System.getenv("STACKIT_OWNER_EMAIL");

final Resources r = new Resources();

Runnable cleanup = () -> {
try {
if (r.networkRange != null) {
iaasApi.deleteVPCNetworkRange(
r.project.getProjectId(),
r.vpc.getId(),
region,
r.networkRange.getVPCNetworkRangeIPv4().getId()
);
while (true) {
try {
String status = iaasApi.getVPCNetworkRange(r.project.getProjectId(), r.vpc.getId(), region, r.networkRange.getVPCNetworkRangeIPv4().getId())
.getVPCNetworkRangeIPv4().getStatus();
if ("FAILED".equals(status)) {
throw new RuntimeException("network range deletion failed");
}
TimeUnit.SECONDS.sleep(5);
} catch (ApiException e) {
if (e.getCode() == 404) {
break;
}
throw e;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
if (r.staticRoute != null) {
iaasApi.deleteVPCStaticRoute(
r.project.getProjectId(),
r.vpc.getId(),
region,
r.vpcRoutingTable.getId(),
r.staticRoute.getId()
);
}
if (r.vpcRoutingTable != null) {
iaasApi.deleteVPCRoutingTable(
r.project.getProjectId(),
r.vpc.getId(),
region,
r.vpcRoutingTable.getId()
);
}
if (r.vpcRegion != null) {
iaasApi.deleteVPCRegion(
r.project.getProjectId(),
r.vpc.getId(),
region
);
while (true) {
try {
String status = iaasApi.getVPCRegion(r.project.getProjectId(), r.vpc.getId(), region)
.getStatus();
if ("FAILED".equals(status)) {
throw new RuntimeException("region deletion failed");
}
TimeUnit.SECONDS.sleep(5);
} catch (ApiException e) {
if (e.getCode() == 404 || e.getCode() == 400) {
break;
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
if (r.vpc != null) {
iaasApi.deleteVPC(
r.project.getProjectId(),
r.vpc.getId()
);
}
if (r.project != null) {
resourceManagerApi.deleteProject(r.project.getProjectId().toString());
}
} catch (ApiException e) {
System.out.println("cleanup failed, there may be resource left over: " + e.getMessage());
}
};

try {
// create project
System.out.println("creating project...");
Set<Member> members = new HashSet<>();
members.add(new Member().subject(ownerEmail).role("owner"));
Map<String, String> labels = new HashMap<>();
labels.put("enable-vpc", "true");
r.project = resourceManagerApi.createProject(new CreateProjectPayload()
.containerParentId(parentContainerId)
.name("vpc-example-project")
.members(members)
.labels(labels)
);
ResourcemanagerWait.createProjectWaitHandler(resourceManagerApi, r.project.getContainerId())
.waitWithContextAsync()
.get();
System.out.println("project created: " + r.project.getProjectId());

// create vpc
System.out.println("creating vpc...");
r.vpc = iaasApi.createVPC(r.project.getProjectId(), new CreateVPCPayload()
.name("example-vpc")
.description("example-vpc")
);
System.out.println("vpc created: " + r.vpc.getId());

// create region (this must happen before creating a routing table or network area)
System.out.println("creating region...");
r.vpcRegion = iaasApi.createVPCRegion(r.project.getProjectId(), r.vpc.getId(), region, new CreateVPCRegionPayload());
while (true) {
try {
String status = iaasApi.getVPCRegion(r.project.getProjectId(), r.vpc.getId(), region).getStatus();
if ("FAILED".equals(status)) {
throw new RuntimeException("region creation failed");
}
if ("CREATED".equals(status)) {
break;
}
TimeUnit.SECONDS.sleep(5);
} catch (ApiException e) {
if (e.getCode() == 404) {
break;
}
}
}
System.out.println("region created");

// create routing table
System.out.println("creating routing table...");
r.vpcRoutingTable = iaasApi.addVPCRoutingTable(
r.project.getProjectId(),
r.vpc.getId(),
region,
new AddVPCRoutingTablePayload()
.name("example-routing-table")
);
System.out.println("routing table created: " + r.vpcRoutingTable.getId());

// create a static route
System.out.println("creating static route...");
r.staticRoute = iaasApi.addVPCStaticRoute(
r.project.getProjectId(),
r.vpc.getId(),
region,
r.vpcRoutingTable.getId(),
new AddVPCStaticRoutePayload()
.destination(new AddVPCStaticRoutePayloadDestination(new DestinationCIDRv4().cidrv4("0.0.0.0/0")))
.nexthop(new AddVPCStaticRoutePayloadNexthop(new NexthopInternet().type("internet")))
);
System.out.println("static route created: " + r.staticRoute.getId());

// create a network range
System.out.println("creating network range...");
r.networkRange = iaasApi.createVPCNetworkRange(
r.project.getProjectId(),
r.vpc.getId(),
region,
new NetworkRangeIPv4Request()
.ipVersion(NetworkRangeIPv4Request.IpVersionEnum.IPV4)
.prefix("192.168.1.0/24")
.description("example-network-range")
.defaultPrefixLen(26L)
.maxPrefixLen(29L)
.minPrefixLen(16L)
.addNameserversItem("10.0.0.1")
.addNameserversItem("10.0.0.8")
);
while (true) {
try {
String status = iaasApi.getVPCNetworkRange(r.project.getProjectId(), r.vpc.getId(), region, r.networkRange.getVPCNetworkRangeIPv4().getId()).getVPCNetworkRangeIPv4().getStatus();
if ("FAILED".equals(status)) {
throw new RuntimeException("region creation failed");
}
if ("CREATED".equals(status)) {
break;
}
TimeUnit.SECONDS.sleep(5);
} catch (ApiException e) {
if (e.getCode() == 404) {
break;
}
}
}
System.out.println("network range created: " + r.networkRange.getVPCNetworkRangeIPv4().getId());
} catch (Exception e) {
System.out.println("failed to create resources: " + e.getMessage());
e.printStackTrace();
} finally {
cleanup.run();
}
}

private static class Resources {
Project project = null;
VPC vpc = null;
RegionalVPC vpcRegion = null;
VPCRoutingTable vpcRoutingTable = null;
Route staticRoute = null;
VPCNetworkRange networkRange = null;
}
}
14 changes: 14 additions & 0 deletions services/iaas/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
## v1.3.0
- new example for managing `VPCs` with the `v2alpha1api`
- `v1api`
- **Braking Change:** remove deprecated operations: `updateImageScopeLocal`, `updateImageScopePublic`
- **Feature:** add attribute `vtpm` (new model `ServerVTPM`) to model `Server`
- **Feature:** add attribute `availabilityZone` to model `Snapshot`
- `v2alpha1api`
- **Feature:** add operations and models to manage `VPCs`
- `v2api`
- **Feature:** add attribute `vpcNetworkRangeId` to models `NetworkIPv4` `NetworkIPv6`
- **Feature:** add attribute `vpcId` to model `Network`,
- **Feature:** add attribute `vtpm` (new model `ServerVTPM`) to model `Server`,
- **Feature:** add attribute `availabilityZone` to model `Snapshot`,

## v1.2.0
- **Feature (breaking change):** Introduction of multi API version support. See the GitHub discussion post for more details: https://github.com/stackitcloud/stackit-sdk-java/discussions/530

Expand Down
2 changes: 1 addition & 1 deletion services/iaas/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.2.0
1.3.0
2 changes: 1 addition & 1 deletion services/iaas/oas_commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1c36f3781c31a0e21c4588c7c4ec835d477d2f21
901ad1f5219d105ea61f25d16862a09c4ad635af
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,8 @@ private static Class getClassByDiscriminator(
new cloud.stackit.sdk.iaas.v1api.model.ServerNetwork.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(
new cloud.stackit.sdk.iaas.v1api.model.ServerNetworking.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(
new cloud.stackit.sdk.iaas.v1api.model.ServerVTPM.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(
new cloud.stackit.sdk.iaas.v1api.model.ServiceAccountMailListResponse
.CustomTypeAdapterFactory());
Expand Down
Loading
Loading