Skip to content
Merged
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
## Release (YYYY-MM-DD)
- `alb`: [v0.6.0](services/alb/CHANGELOG.md#v060)
- **Breaking change:** Remove `v2beta` API
- `iaas`: [v1.3.0](services/iaas/CHANGELOG.md#v130)
- 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`,

## Release (2026-04-28)
- `alb`: [v0.5.0](services/alb/CHANGELOG.md#v050)
Expand Down
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,291 @@
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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SuppressWarnings({
"PMD.CyclomaticComplexity",
"PMD.CognitiveComplexity",
"PMD.NcssCount",
"PMD.SystemPrintln",
"PMD.AvoidThrowingRawExceptionTypes",
"PMD.AvoidLiteralsInIfCondition",
"PMD.AvoidUsingHardCodedIP",
"PMD.AvoidDuplicateLiterals",
"PMD.ShortVariable",
"PMD.UseUtilityClass",
"PMD.AvoidPrintStackTrace",
"PMD.AvoidCatchingGenericException",
"PMD.ExceptionAsFlowControl",
"PMD.UseConcurrentHashMap",
})
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()
.type("cidrv4")
.value("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 final class Resources {
private Project project;
private VPC vpc;
private RegionalVPC vpcRegion;
private VPCRoutingTable vpcRoutingTable;
private Route staticRoute;
private VPCNetworkRange networkRange;
}
}
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
d5bd75f47f4b364fa6f71663efb4ba41ec703ac8
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
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@

package cloud.stackit.sdk.iaas.v1api;

@javax.annotation.Generated(
value = "org.openapitools.codegen.languages.JavaClientCodegen",
comments = "Generator version: 7.19.0")
@javax.annotation.Generated(value = "JavaGenerator", comments = "Generator version: 7.19.0")
public class Pair {
private final String name;
private final String value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
import java.util.Map;

/** Representing a Server configuration. */
@javax.annotation.Generated(
value = "org.openapitools.codegen.languages.JavaClientCodegen",
comments = "Generator version: 7.19.0")
@javax.annotation.Generated(value = "JavaGenerator", comments = "Generator version: 7.19.0")
public class ServerConfiguration {
public String URL;
public String description;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
import java.util.HashSet;

/** Representing a Server Variable for server URL template substitution. */
@javax.annotation.Generated(
value = "org.openapitools.codegen.languages.JavaClientCodegen",
comments = "Generator version: 7.19.0")
@javax.annotation.Generated(value = "JavaGenerator", comments = "Generator version: 7.19.0")
public class ServerVariable {
public String description;
public String defaultValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
import java.util.Collection;
import java.util.Iterator;

@javax.annotation.Generated(
value = "org.openapitools.codegen.languages.JavaClientCodegen",
comments = "Generator version: 7.19.0")
@javax.annotation.Generated(value = "JavaGenerator", comments = "Generator version: 7.19.0")
public class StringUtil {
/**
* Check if the given array contains the given value (with case-insensitive comparison).
Expand Down
Loading
Loading