From d7d57aa71b49d1658e828290ffff7d40bcfac185 Mon Sep 17 00:00:00 2001 From: "Jain, Rajiv" Date: Mon, 13 Oct 2025 11:19:51 +0530 Subject: [PATCH] Feignconfiguration and volume feignClient along with desired POJOs --- plugins/storage/volume/ontap/pom.xml | 48 ++++++++++ .../storage/feign/FeignConfiguration.java | 93 +++++++++++++++++++ .../feign/client/VolumeFeignClient.java | 42 +++++++++ .../storage/feign/model/Aggregate.java | 83 +++++++++++++++++ .../storage/feign/model/AntiRansomware.java | 12 +++ .../storage/feign/model/ExportPolicy.java | 15 +++ .../cloudstack/storage/feign/model/Nas.java | 16 ++++ .../storage/feign/model/Policy.java | 26 ++++++ .../cloudstack/storage/feign/model/Qos.java | 13 +++ .../cloudstack/storage/feign/model/Svm.java | 42 +++++++++ .../storage/feign/model/Volume.java | 71 ++++++++++++++ .../storage/feign/model/VolumeQosPolicy.java | 28 ++++++ .../storage/feign/model/VolumeSpace.java | 19 ++++ .../feign/model/VolumeSpaceLogicalSpace.java | 17 ++++ .../feign/model/request/VolumeRequestDTO.java | 29 ++++++ .../feign/model/response/JobResponseDTO.java | 29 ++++++ .../response/VolumeDetailsResponseDTO.java | 56 +++++++++++ .../storage-volume-ontap/logback-spring.xml | 26 ++++++ 18 files changed, 665 insertions(+) create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/FeignConfiguration.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/client/VolumeFeignClient.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Aggregate.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/AntiRansomware.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/ExportPolicy.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Nas.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Policy.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Qos.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Svm.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Volume.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeQosPolicy.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpace.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpaceLogicalSpace.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/request/VolumeRequestDTO.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/JobResponseDTO.java create mode 100644 plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/VolumeDetailsResponseDTO.java create mode 100644 plugins/storage/volume/ontap/src/main/resources/META-INF/cloudstack/storage-volume-ontap/logback-spring.xml diff --git a/plugins/storage/volume/ontap/pom.xml b/plugins/storage/volume/ontap/pom.xml index decfb29743da..e5c7543e2e2a 100644 --- a/plugins/storage/volume/ontap/pom.xml +++ b/plugins/storage/volume/ontap/pom.xml @@ -27,6 +27,21 @@ 4.22.0.0-SNAPSHOT ../../../pom.xml + + 2021.0.7 + 11.0 + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + org.apache.cloudstack @@ -38,14 +53,47 @@ json 20230227 + + org.springframework.cloud + spring-cloud-commons + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.security + spring-security-crypto + + + + + io.github.openfeign + feign-httpclient + ${openfeign.version} + org.apache.cloudstack cloud-engine-storage-volume ${project.version} + + io.swagger + swagger-annotations + 1.6.2 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + maven-surefire-plugin diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/FeignConfiguration.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/FeignConfiguration.java new file mode 100644 index 000000000000..54e72d1b28a0 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/FeignConfiguration.java @@ -0,0 +1,93 @@ +package org.apache.cloudstack.storage.feign; + + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import feign.Retryer; +import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory; +import org.apache.http.conn.ConnectionKeepAliveStrategy; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustAllStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.ssl.SSLContexts; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import feign.Client; +import feign.httpclient.ApacheHttpClient; +import javax.net.ssl.SSLContext; +import java.util.concurrent.TimeUnit; + +@Configuration +public class FeignConfiguration { + private static Logger logger = LogManager.getLogger(FeignConfiguration.class); + + private int retryMaxAttempt = 3; + + private int retryMaxInterval = 5; + + private String ontapFeignMaxConnection = "80"; + + private String ontapFeignMaxConnectionPerRoute = "20"; + + @Bean + public Client client(ApacheHttpClientFactory httpClientFactory) { + + int maxConn; + int maxConnPerRoute; + try { + maxConn = Integer.parseInt(this.ontapFeignMaxConnection); + } catch (Exception e) { + logger.error("ontapFeignClient: encounter exception while parse the max connection from env. setting default value"); + maxConn = 20; + } + try { + maxConnPerRoute = Integer.parseInt(this.ontapFeignMaxConnectionPerRoute); + } catch (Exception e) { + logger.error("ontapFeignClient: encounter exception while parse the max connection per route from env. setting default value"); + maxConnPerRoute = 2; + } + // Disable Keep Alive for Http Connection + logger.debug("ontapFeignClient: Setting the feign client config values as max connection: {}, max connections per route: {}", maxConn, maxConnPerRoute); + ConnectionKeepAliveStrategy keepAliveStrategy = (response, context) -> 0; + CloseableHttpClient httpClient = httpClientFactory.createBuilder() + .setMaxConnTotal(maxConn) + .setMaxConnPerRoute(maxConnPerRoute) + .setKeepAliveStrategy(keepAliveStrategy) + .setSSLSocketFactory(getSSLSocketFactory()) + .setConnectionTimeToLive(60, TimeUnit.SECONDS) + .build(); + return new ApacheHttpClient(httpClient); + } + + private SSLConnectionSocketFactory getSSLSocketFactory() { + try { + // The TrustAllStrategy is a strategy used in SSL context configuration that accepts any certificate + SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustAllStrategy()).build(); + return new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + + @Bean + public RequestInterceptor requestInterceptor() { + return new RequestInterceptor() { + @Override + public void apply(RequestTemplate template) { + logger.info("Feign Request URL: {}", template.url()); + logger.info("HTTP Method: {}", template.method()); + logger.info("Headers: {}", template.headers()); + logger.info("Body: {}", template.requestBody().asString()); + } + }; + } + + @Bean + public Retryer feignRetryer() { + return new Retryer.Default(1000L, retryMaxInterval * 1000L, retryMaxAttempt); + } +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/client/VolumeFeignClient.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/client/VolumeFeignClient.java new file mode 100644 index 000000000000..7256db8c1666 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/client/VolumeFeignClient.java @@ -0,0 +1,42 @@ +package org.apache.cloudstack.storage.feign.client; + + +import org.apache.cloudstack.storage.feign.FeignConfiguration; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + + +@FeignClient(name = "VolumeClient", url = "https://{clusterIP}/api/storage/volumes", configuration = FeignConfiguration.class) +public interface VolumeFeignClient { + + @DeleteMapping("/storage/volumes/{id}") + void deleteVolume(@RequestHeader("Authorization") String authHeader, + @PathVariable("id") String volumeId); + + @PostMapping("/api/storage/volumes") + org.apache.cloudstack.storage.feign.model.response.JobResponseDTO createVolumeWithJob( + @RequestHeader("Authorization") String authHeader, + @RequestBody org.apache.cloudstack.storage.feign.model.request.VolumeRequestDTO request + ); + + @GetMapping("/api/storage/volumes/{uuid}") + org.apache.cloudstack.storage.feign.model.response.VolumeDetailsResponseDTO getVolumeDetails( + @RequestHeader("Authorization") String authHeader, + @PathVariable("uuid") String uuid + ); + + @PatchMapping("/api/storage/volumes/{uuid}") + org.apache.cloudstack.storage.feign.model.response.JobResponseDTO updateVolumeRebalancing( + @RequestHeader("accept") String acceptHeader, + @PathVariable("uuid") String uuid, + @RequestBody org.apache.cloudstack.storage.feign.model.request.VolumeRequestDTO request + ); + + +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Aggregate.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Aggregate.java new file mode 100644 index 000000000000..fa19896be968 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Aggregate.java @@ -0,0 +1,83 @@ +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.google.gson.annotations.SerializedName; + +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Aggregate { + + @SerializedName("name") + private String name = null; + + @SerializedName("uuid") + private String uuid = null; + + public Aggregate name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * + * @return name + **/ + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Aggregate uuid(String uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * + * @return uuid + **/ + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Aggregate diskAggregates = (Aggregate) o; + return Objects.equals(this.name, diskAggregates.name) && + Objects.equals(this.uuid, diskAggregates.uuid); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + @Override + public String toString() { + return "DiskAggregates [name=" + name + ", uuid=" + uuid + "]"; + } + +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/AntiRansomware.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/AntiRansomware.java new file mode 100644 index 000000000000..2b5bdeed6cbe --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/AntiRansomware.java @@ -0,0 +1,12 @@ +// AntiRansomware.java +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AntiRansomware { + @JsonProperty("state") + private String state; + + // Getters and setters +} + diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/ExportPolicy.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/ExportPolicy.java new file mode 100644 index 000000000000..50ec9f38a88a --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/ExportPolicy.java @@ -0,0 +1,15 @@ +// ExportPolicy.java +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ExportPolicy { + private String name; + private long id; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public long getId() { return id; } + public void setId(long id) { this.id = id; } +} + diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Nas.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Nas.java new file mode 100644 index 000000000000..406fbc381419 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Nas.java @@ -0,0 +1,16 @@ +// Nas.java +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Nas { + @JsonProperty("path") + private String path; + + @JsonProperty("export_policy") + private ExportPolicy exportPolicy; + + // Getters and setters +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Policy.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Policy.java new file mode 100644 index 000000000000..73f280dc7834 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Policy.java @@ -0,0 +1,26 @@ + +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Policy { + private int minThroughputIops; + private int minThroughputMbps; + private int maxThroughputIops; + private int maxThroughputMbps; + private String uuid; + private String name; + public int getMinThroughputIops() { return minThroughputIops; } + public void setMinThroughputIops(int minThroughputIops) { this.minThroughputIops = minThroughputIops; } + public int getMinThroughputMbps() { return minThroughputMbps; } + public void setMinThroughputMbps(int minThroughputMbps) { this.minThroughputMbps = minThroughputMbps; } + public int getMaxThroughputIops() { return maxThroughputIops; } + public void setMaxThroughputIops(int maxThroughputIops) { this.maxThroughputIops = maxThroughputIops; } + public int getMaxThroughputMbps() { return maxThroughputMbps; } + public void setMaxThroughputMbps(int maxThroughputMbps) { this.maxThroughputMbps = maxThroughputMbps; } + public String getUuid() { return uuid; } + public void setUuid(String uuid) { this.uuid = uuid; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Qos.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Qos.java new file mode 100644 index 000000000000..3a8227b26498 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Qos.java @@ -0,0 +1,13 @@ +// Qos.java +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Qos { + @JsonProperty("policy") + private Policy policy; + + // Getters and setters +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Svm.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Svm.java new file mode 100644 index 000000000000..e2223f418325 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Svm.java @@ -0,0 +1,42 @@ +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Svm { + @JsonProperty("uuid") + @SerializedName("uuid") + private String uuid = null; + + @JsonProperty("name") + @SerializedName("name") + private String name = null; + + @JsonProperty("iscsi.enabled") + @SerializedName("iscsi.enabled") + private Boolean iscsiEnabled = null; + + @JsonProperty("fcp.enabled") + @SerializedName("fcp.enabled") + private Boolean fcpEnabled = null; + + @JsonProperty("nfs.enabled") + @SerializedName("nfs.enabled") + private Boolean nfsEnabled = null; + + @JsonProperty("aggregates") + @SerializedName("aggregates") + private List aggregates = null; + + @JsonProperty("aggregates_delegated") + @SerializedName("aggregates_delegated") + private Boolean aggregatesDelegated = null; + + @JsonProperty("state.value") + @SerializedName("state.value") + private String state = null; +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Volume.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Volume.java new file mode 100644 index 000000000000..cfca9b6627e8 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/Volume.java @@ -0,0 +1,71 @@ +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Volume { + @JsonProperty("uuid") + private String uuid; + + @JsonProperty("name") + private String name; + + @JsonProperty("state") + private String state; + + @JsonProperty("nas") + private Nas nas; + + @JsonProperty("svm") + private Svm svm; + + @JsonProperty("qos") + private Qos qos; + + @JsonProperty("space") + private VolumeSpace space; + + @JsonProperty("anti_ransomware") + private AntiRansomware antiRansomware; + + // Getters and setters + public String getUuid() { + return uuid; + } + public void setUuid(String uuid) { + this.uuid = uuid; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Nas getNas() { + return nas; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Volume volume = (Volume) o; + return Objects.equals(uuid, volume.uuid); + } + + @Override + public int hashCode() { + return Objects.hashCode(uuid); + } +} + diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeQosPolicy.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeQosPolicy.java new file mode 100644 index 000000000000..76065cf92cda --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeQosPolicy.java @@ -0,0 +1,28 @@ +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VolumeQosPolicy { + @JsonProperty("max_throughput_iops") + @SerializedName("max_throughput_iops") + private Integer maxThroughputIops = null; + + @JsonProperty("max_throughput_mbps") + @SerializedName("max_throughput_mbps") + private Integer maxThroughputMbps = null; + + @JsonProperty("min_throughput_iops") + @SerializedName("min_throughput_iops") + private Integer minThroughputIops = null; + + @JsonProperty("name") + @SerializedName("name") + private String name = null; + + @JsonProperty("uuid") + @SerializedName("uuid") + private String uuid = null; +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpace.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpace.java new file mode 100644 index 000000000000..bc438b325156 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpace.java @@ -0,0 +1,19 @@ + +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VolumeSpace { + @JsonProperty("size") + private long size; + + @JsonProperty("available") + private long available; + + @JsonProperty("used") + private long used; + + // Getters and setters +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpaceLogicalSpace.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpaceLogicalSpace.java new file mode 100644 index 000000000000..2e509ffc33d5 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/VolumeSpaceLogicalSpace.java @@ -0,0 +1,17 @@ +package org.apache.cloudstack.storage.feign.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class VolumeSpaceLogicalSpace { + + @JsonProperty("available") + @SerializedName("available") + private Long available = null; + + @JsonProperty("used") + @SerializedName("used") + private Double used = null; +} diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/request/VolumeRequestDTO.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/request/VolumeRequestDTO.java new file mode 100644 index 000000000000..d1141fece481 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/request/VolumeRequestDTO.java @@ -0,0 +1,29 @@ +package org.apache.cloudstack.storage.feign.model.request; + +import java.util.List; + +public class VolumeRequestDTO { + private String name; + private List aggregates; + private SvmDTO svm; + + // getters and setters + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public List getAggregates() { return aggregates; } + public void setAggregates(List aggregates) { this.aggregates = aggregates; } + public SvmDTO getSvm() { return svm; } + public void setSvm(SvmDTO svm) { this.svm = svm; } + + public static class AggregateDTO { + private String name; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + } + + public static class SvmDTO { + private String name; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + } +} \ No newline at end of file diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/JobResponseDTO.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/JobResponseDTO.java new file mode 100644 index 000000000000..34a4acaf9f55 --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/JobResponseDTO.java @@ -0,0 +1,29 @@ +package org.apache.cloudstack.storage.feign.model.response; + +public class JobResponseDTO { + private Job job; + public Job getJob() { return job; } + public void setJob(Job job) { this.job = job; } + + public static class Job { + private String uuid; + private Links links; + public String getUuid() { return uuid; } + public void setUuid(String uuid) { this.uuid = uuid; } + public Links getLinks() { return links; } + public void setLinks(Links links) { this.links = links; } + } + + public static class Links { + private Self self; + public Self getSelf() { return self; } + public void setSelf(Self self) { this.self = self; } + } + + public static class Self { + private String href; + public String getHref() { return href; } + public void setHref(String href) { this.href = href; } + } +} + diff --git a/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/VolumeDetailsResponseDTO.java b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/VolumeDetailsResponseDTO.java new file mode 100644 index 000000000000..a045e39e198a --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/response/VolumeDetailsResponseDTO.java @@ -0,0 +1,56 @@ +package org.apache.cloudstack.storage.feign.model.response; + + +import org.apache.cloudstack.storage.feign.model.Aggregate; +import org.apache.cloudstack.storage.feign.model.Nas; +import org.apache.cloudstack.storage.feign.model.Qos; + +import java.util.List; + +public class VolumeDetailsResponseDTO { + private String uuid; + private String createTime; + private String name; + private long size; + private String state; + private String style; + private List aggregates; + private Nas nas; + private Qos qos; + private Svm svm; + private String antiRansomwareState; + + // getters and setters + public String getUuid() { return uuid; } + public void setUuid(String uuid) { this.uuid = uuid; } + public String getCreateTime() { return createTime; } + public void setCreateTime(String createTime) { this.createTime = createTime; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public long getSize() { return size; } + public void setSize(long size) { this.size = size; } + public String getState() { return state; } + public void setState(String state) { this.state = state; } + public String getStyle() { return style; } + public void setStyle(String style) { this.style = style; } + public List getAggregates() { return aggregates; } + public void setAggregates(List aggregates) { this.aggregates = aggregates; } + public Nas getNas() { return nas; } + public void setNas(Nas nas) { this.nas = nas; } + public Qos getQos() { return qos; } + public void setQos(Qos qos) { this.qos = qos; } + public Svm getSvm() { return svm; } + public void setSvm(Svm svm) { this.svm = svm; } + public String getAntiRansomwareState() { return antiRansomwareState; } + public void setAntiRansomwareState(String antiRansomwareState) { this.antiRansomwareState = antiRansomwareState; } + + public static class Svm { + private String name; + private String uuid; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getUuid() { return uuid; } + public void setUuid(String uuid) { this.uuid = uuid; } + } +} + diff --git a/plugins/storage/volume/ontap/src/main/resources/META-INF/cloudstack/storage-volume-ontap/logback-spring.xml b/plugins/storage/volume/ontap/src/main/resources/META-INF/cloudstack/storage-volume-ontap/logback-spring.xml new file mode 100644 index 000000000000..017a9b3c74aa --- /dev/null +++ b/plugins/storage/volume/ontap/src/main/resources/META-INF/cloudstack/storage-volume-ontap/logback-spring.xml @@ -0,0 +1,26 @@ + + + + + + logs/feign-requests.log + + logs/feign-requests.%d{yyyy-MM-dd}.log + 30 + + + %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n + + + + + + + + + + + + + +