Skip to content

Commit fce1ea2

Browse files
committed
[PLAT-18823] Annotate YBA HA APIs to document them
Summary: the current YBA HA APIs are undocumented,We need to document these APIs which are well tested and ready to be consumed Test Plan: manual Reviewers: #yba-api-review, dkumar Reviewed By: #yba-api-review, dkumar Subscribers: yugaware Differential Revision: https://phorge.dev.yugabyte.com/D48139
1 parent 8dcf80e commit fce1ea2

File tree

10 files changed

+1857
-4
lines changed

10 files changed

+1857
-4
lines changed

managed/src/main/java/com/yugabyte/yw/controllers/HAController.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@
2323
import com.yugabyte.yw.models.Audit;
2424
import com.yugabyte.yw.models.HighAvailabilityConfig;
2525
import com.yugabyte.yw.models.PlatformInstance;
26+
import com.yugabyte.yw.models.common.YbaApi;
2627
import com.yugabyte.yw.rbac.annotations.AuthzPath;
2728
import com.yugabyte.yw.rbac.annotations.PermissionAttribute;
2829
import com.yugabyte.yw.rbac.annotations.RequiredPermissionOnResource;
2930
import com.yugabyte.yw.rbac.annotations.Resource;
3031
import com.yugabyte.yw.rbac.enums.SourceType;
32+
import io.swagger.annotations.Api;
33+
import io.swagger.annotations.ApiImplicitParam;
34+
import io.swagger.annotations.ApiImplicitParams;
3135
import io.swagger.annotations.ApiOperation;
36+
import io.swagger.annotations.Authorization;
3237
import java.util.List;
3338
import java.util.Objects;
3439
import java.util.Optional;
@@ -39,10 +44,23 @@
3944
import play.mvc.Result;
4045
import play.mvc.Results;
4146

47+
@Api(value = "HA", authorizations = @Authorization(AbstractPlatformController.API_KEY_AUTH))
4248
@Slf4j
4349
public class HAController extends AuthenticatedController {
4450
@Inject private PlatformReplicationManager replicationManager;
4551

52+
@ApiOperation(
53+
notes = "Available since YBA version 2.20.0.",
54+
nickname = "createHAConfig",
55+
value = "Create high availability config",
56+
response = HighAvailabilityConfig.class)
57+
@ApiImplicitParams(
58+
@ApiImplicitParam(
59+
name = "HAConfigFormRequest",
60+
paramType = "body",
61+
dataType = "com.yugabyte.yw.forms.HAConfigFormData",
62+
required = true))
63+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
4664
@AuthzPath({
4765
@RequiredPermissionOnResource(
4866
requiredPermission =
@@ -152,6 +170,12 @@ public Result deleteHAConfig(UUID configUUID, Http.Request request) {
152170
return ok();
153171
}
154172

173+
@ApiOperation(
174+
notes = "Available since YBA version 2.20.0.",
175+
value = "Generate cluster key",
176+
response = JsonNode.class,
177+
nickname = "generateClusterKey")
178+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
155179
@AuthzPath({
156180
@RequiredPermissionOnResource(
157181
requiredPermission =

managed/src/main/java/com/yugabyte/yw/controllers/InternalHAController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import com.yugabyte.yw.forms.PlatformResults.YBPSuccess;
2424
import com.yugabyte.yw.models.HighAvailabilityConfig;
2525
import com.yugabyte.yw.models.PlatformInstance;
26+
import com.yugabyte.yw.models.common.YbaApi;
27+
import io.swagger.annotations.Api;
28+
import io.swagger.annotations.ApiOperation;
2629
import java.net.URL;
2730
import java.util.Date;
2831
import java.util.List;
@@ -39,6 +42,7 @@
3942
import play.mvc.Result;
4043
import play.mvc.With;
4144

45+
@Api(value = "Internal HA")
4246
@With(HAAuthenticator.class)
4347
@Slf4j
4448
public class InternalHAController extends Controller {
@@ -180,6 +184,12 @@ public Result syncBackups(Http.Request request) throws Exception {
180184
}
181185

182186
/** This is invoked by the remote peer to demote this local leader. */
187+
@ApiOperation(
188+
notes = "Available since YBA version 2.20.0.",
189+
value = "Demote local leader",
190+
response = PlatformInstance.class,
191+
nickname = "demoteLocalLeader")
192+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
183193
public Result demoteLocalLeader(long timestamp, boolean promote, Http.Request request) {
184194
log.debug("Received request to demote local instance from {}", request.remoteAddress());
185195
String clusterKey = getClusterKey(request);

managed/src/main/java/com/yugabyte/yw/controllers/PlatformInstanceController.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,17 @@
2525
import com.yugabyte.yw.models.Audit;
2626
import com.yugabyte.yw.models.HighAvailabilityConfig;
2727
import com.yugabyte.yw.models.PlatformInstance;
28+
import com.yugabyte.yw.models.common.YbaApi;
2829
import com.yugabyte.yw.rbac.annotations.AuthzPath;
2930
import com.yugabyte.yw.rbac.annotations.PermissionAttribute;
3031
import com.yugabyte.yw.rbac.annotations.RequiredPermissionOnResource;
3132
import com.yugabyte.yw.rbac.annotations.Resource;
3233
import com.yugabyte.yw.rbac.enums.SourceType;
34+
import io.swagger.annotations.Api;
35+
import io.swagger.annotations.ApiImplicitParam;
36+
import io.swagger.annotations.ApiImplicitParams;
37+
import io.swagger.annotations.ApiOperation;
38+
import io.swagger.annotations.Authorization;
3339
import java.io.File;
3440
import java.net.URL;
3541
import java.util.Objects;
@@ -40,6 +46,9 @@
4046
import play.mvc.Http;
4147
import play.mvc.Result;
4248

49+
@Api(
50+
value = "Platform Instance",
51+
authorizations = @Authorization(AbstractPlatformController.API_KEY_AUTH))
4352
@Slf4j
4453
public class PlatformInstanceController extends AuthenticatedController {
4554
@Inject private PlatformReplicationManager replicationManager;
@@ -48,6 +57,18 @@ public class PlatformInstanceController extends AuthenticatedController {
4857

4958
@Inject CustomerTaskManager taskManager;
5059

60+
@ApiOperation(
61+
notes = "Available since YBA version 2.20.0.",
62+
value = "Create platform instance",
63+
response = PlatformInstance.class,
64+
nickname = "createInstance")
65+
@ApiImplicitParams(
66+
@ApiImplicitParam(
67+
name = "PlatformInstanceFormRequest",
68+
paramType = "body",
69+
dataType = "com.yugabyte.yw.forms.PlatformInstanceFormData",
70+
required = true))
71+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
5172
@AuthzPath({
5273
@RequiredPermissionOnResource(
5374
requiredPermission =
@@ -185,6 +206,17 @@ public Result getLocal(UUID configUUID) {
185206
return PlatformResults.withData(localInstance.get());
186207
}
187208

209+
@ApiOperation(
210+
notes = "Available since YBA version 2.20.0.",
211+
value = "Promote platform instance",
212+
nickname = "promoteInstance")
213+
@ApiImplicitParams(
214+
@ApiImplicitParam(
215+
name = "PlatformBackupRestoreRequest",
216+
paramType = "body",
217+
dataType = "com.yugabyte.yw.forms.RestorePlatformBackupFormData",
218+
required = true))
219+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
188220
@AuthzPath({
189221
@RequiredPermissionOnResource(
190222
requiredPermission =

managed/src/main/java/com/yugabyte/yw/controllers/PlatformReplicationController.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,17 @@
2323
import com.yugabyte.yw.models.Audit;
2424
import com.yugabyte.yw.models.HighAvailabilityConfig;
2525
import com.yugabyte.yw.models.PlatformInstance;
26+
import com.yugabyte.yw.models.common.YbaApi;
2627
import com.yugabyte.yw.rbac.annotations.AuthzPath;
2728
import com.yugabyte.yw.rbac.annotations.PermissionAttribute;
2829
import com.yugabyte.yw.rbac.annotations.RequiredPermissionOnResource;
2930
import com.yugabyte.yw.rbac.annotations.Resource;
3031
import com.yugabyte.yw.rbac.enums.SourceType;
32+
import io.swagger.annotations.Api;
33+
import io.swagger.annotations.ApiImplicitParam;
34+
import io.swagger.annotations.ApiImplicitParams;
35+
import io.swagger.annotations.ApiOperation;
36+
import io.swagger.annotations.Authorization;
3137
import java.io.File;
3238
import java.time.Duration;
3339
import java.util.Collections;
@@ -39,10 +45,25 @@
3945
import play.mvc.Http;
4046
import play.mvc.Result;
4147

48+
@Api(
49+
value = "Platform Replication",
50+
authorizations = @Authorization(AbstractPlatformController.API_KEY_AUTH))
4251
public class PlatformReplicationController extends AuthenticatedController {
4352

4453
@Inject private PlatformReplicationManager replicationManager;
4554

55+
@ApiOperation(
56+
notes = "Available since YBA version 2.20.0.",
57+
value = "Start periodic backup",
58+
response = JsonNode.class,
59+
nickname = "startPeriodicBackup")
60+
@ApiImplicitParams(
61+
@ApiImplicitParam(
62+
name = "PlatformBackupFrequencyRequest",
63+
paramType = "body",
64+
dataType = "com.yugabyte.yw.forms.PlatformBackupFrequencyFormData",
65+
required = true))
66+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
4667
@AuthzPath({
4768
@RequiredPermissionOnResource(
4869
requiredPermission =
@@ -104,6 +125,13 @@ public Result getBackupInfo(UUID configUUID) {
104125
return ok(replicationManager.getBackupInfo());
105126
}
106127

128+
@ApiOperation(
129+
notes = "Available since YBA version 2.20.0.",
130+
nickname = "listBackups",
131+
value = "List backups",
132+
response = String.class,
133+
responseContainer = "List")
134+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
107135
@AuthzPath
108136
public Result listBackups(UUID configUUID, String leaderAddr) {
109137
HighAvailabilityConfig config =

managed/src/main/java/com/yugabyte/yw/controllers/SessionController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,15 @@ public static class SessionInfo {
181181
}
182182

183183
@ApiOperation(
184+
notes = "Available since YBA version 2.20.0.",
184185
nickname = "getSessionInfo",
185186
value =
186187
"Get current user and customer uuid. This will not generate or return the API token, use"
187188
+ " /api_token API for that.",
188189
authorizations = @Authorization(AbstractPlatformController.API_KEY_AUTH),
189190
response = SessionInfo.class)
190191
@With(TokenAuthenticator.class)
192+
@YbaApi(visibility = YbaApi.YbaApiVisibility.PUBLIC, sinceYBAVersion = "2.20.0")
191193
@AuthzPath
192194
public Result getSessionInfo(Http.Request request) {
193195
Users user = CommonUtils.getUserFromContext();

managed/src/main/java/com/yugabyte/yw/forms/HAConfigGetResp.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* Copyright 2024 YugabyteDB, Inc. and Contributors */
22
package com.yugabyte.yw.forms;
33

4+
import com.fasterxml.jackson.annotation.JsonFormat;
45
import com.fasterxml.jackson.annotation.JsonProperty;
56
import com.yugabyte.yw.common.HaConfigStates.GlobalState;
67
import com.yugabyte.yw.models.HighAvailabilityConfig;
@@ -30,8 +31,9 @@ public String getClusterKey() {
3031
return haConfig.getClusterKey();
3132
}
3233

33-
@ApiModelProperty(value = "HA last failover")
34+
@ApiModelProperty(value = "HA last failover", example = "2022-12-12T13:07:18Z")
3435
@JsonProperty("last_failover")
36+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
3537
public Date getLastFailover() {
3638
return haConfig.getLastFailover();
3739
}

managed/src/main/java/com/yugabyte/yw/models/HighAvailabilityConfig.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212

1313
import static play.mvc.Http.Status.BAD_REQUEST;
1414

15+
import com.fasterxml.jackson.annotation.JsonFormat;
1516
import com.fasterxml.jackson.annotation.JsonIgnore;
1617
import com.fasterxml.jackson.annotation.JsonProperty;
1718
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
19+
import com.fasterxml.jackson.annotation.JsonSetter;
1820
import com.typesafe.config.ConfigValue;
1921
import com.typesafe.config.ConfigValueFactory;
2022
import com.yugabyte.yw.common.HaConfigStates.GlobalState;
@@ -26,6 +28,7 @@
2628
import com.yugabyte.yw.common.inject.StaticInjectorHolder;
2729
import io.ebean.Finder;
2830
import io.ebean.Model;
31+
import io.swagger.annotations.ApiModelProperty;
2932
import jakarta.persistence.CascadeType;
3033
import jakarta.persistence.Column;
3134
import jakarta.persistence.Entity;
@@ -70,7 +73,7 @@ public class HighAvailabilityConfig extends Model {
7073
@JsonProperty("cluster_key")
7174
private String clusterKey;
7275

73-
private Long lastFailover;
76+
@JsonIgnore private Long lastFailover;
7477

7578
@OneToMany(mappedBy = "config", cascade = CascadeType.ALL)
7679
private List<PlatformInstance> instances;
@@ -89,11 +92,19 @@ public void updateLastFailover() {
8992
this.update();
9093
}
9194

95+
@ApiModelProperty(value = "HA last failover", example = "2022-12-12T13:07:18Z")
9296
@JsonProperty("last_failover")
97+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
9398
public Date getLastFailover() {
9499
return (this.lastFailover != null) ? new Date(this.lastFailover) : null;
95100
}
96101

102+
@JsonSetter("last_failover")
103+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
104+
public void setLastFailover(Date lastFailover) {
105+
this.lastFailover = (lastFailover != null) ? lastFailover.getTime() : null;
106+
}
107+
97108
public void updateAcceptAnyCertificate(boolean acceptAnyCertificate) {
98109
this.acceptAnyCertificate = acceptAnyCertificate;
99110
this.update();

managed/src/main/java/com/yugabyte/yw/models/PlatformInstance.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package com.yugabyte.yw.models;
1212

13+
import com.fasterxml.jackson.annotation.JsonFormat;
1314
import com.fasterxml.jackson.annotation.JsonGetter;
1415
import com.fasterxml.jackson.annotation.JsonIgnore;
1516
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -31,6 +32,7 @@
3132
import com.yugabyte.yw.common.inject.StaticInjectorHolder;
3233
import io.ebean.Finder;
3334
import io.ebean.Model;
35+
import io.swagger.annotations.ApiModelProperty;
3436
import jakarta.persistence.Column;
3537
import jakarta.persistence.Entity;
3638
import jakarta.persistence.Id;
@@ -76,7 +78,9 @@ public class PlatformInstance extends Model {
7678

7779
@Constraints.Required
7880
@Temporal(TemporalType.TIMESTAMP)
81+
@ApiModelProperty(value = "Last backup time", example = "2022-12-12T13:07:18Z")
7982
@JsonProperty("last_backup")
83+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
8084
private Date lastBackup;
8185

8286
@Constraints.Required()

0 commit comments

Comments
 (0)