diff --git a/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/grpc/AviatorGrpcClient.java b/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/grpc/AviatorGrpcClient.java index 5bb2e6c744..d3a1b2bf24 100644 --- a/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/grpc/AviatorGrpcClient.java +++ b/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/grpc/AviatorGrpcClient.java @@ -181,6 +181,11 @@ public Application updateApplication(String projectId, String newName, String si return GrpcUtil.executeGrpcCall(blockingStub, ApplicationServiceGrpc.ApplicationServiceBlockingStub::updateApplication, request, Constants.OP_UPDATE_APP); } + public Application addEntitlement(String projectId, String signature, String message, String tenantName) { + ApplicationById request = ApplicationById.newBuilder().setId(Long.parseLong(projectId)).setSignature(signature).setMessage(message).setTenantName(tenantName).build(); + return GrpcUtil.executeGrpcCall(blockingStub, ApplicationServiceGrpc.ApplicationServiceBlockingStub::addEntitlement, request, Constants.OP_ADD_APP_ENTITLEMENT); + } + public ApplicationResponseMessage deleteApplication(String projectId, String signature, String message, String tenantName) { ApplicationById request = ApplicationById.newBuilder().setId(Long.parseLong(projectId)).setSignature(signature).setMessage(message).setTenantName(tenantName).build(); return GrpcUtil.executeGrpcCall(blockingStub, ApplicationServiceGrpc.ApplicationServiceBlockingStub::deleteApplication, request, Constants.OP_DELETE_APP); diff --git a/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/util/Constants.java b/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/util/Constants.java index 6f7540e2ed..022defe545 100644 --- a/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/util/Constants.java +++ b/fcli-core/fcli-aviator-common/src/main/java/com/fortify/cli/aviator/util/Constants.java @@ -60,6 +60,7 @@ public class Constants { // Operation constants for error messages public static final String OP_CREATE_APP = "application creation"; + public static final String OP_ADD_APP_ENTITLEMENT = "application entitlement increment"; public static final String OP_UPDATE_APP = "application update"; public static final String OP_DELETE_APP = "application deletion"; public static final String OP_GET_APP = "retrieving application"; diff --git a/fcli-core/fcli-aviator-common/src/main/proto/Application.proto b/fcli-core/fcli-aviator-common/src/main/proto/Application.proto index a2e332ec8e..a31497e93e 100644 --- a/fcli-core/fcli-aviator-common/src/main/proto/Application.proto +++ b/fcli-core/fcli-aviator-common/src/main/proto/Application.proto @@ -19,6 +19,10 @@ message Application { string legalTermsOfService=7; string quota_last_updated=8; int64 quota=9; + int64 entitlement_multiplier = 10; + int64 entitlements_consumed = 11; + int64 effective_initial_quota = 12; + int64 effective_monthly_quota = 13; } message CreateApplicationRequest { @@ -77,6 +81,7 @@ service ApplicationService { rpc CreateApplication(CreateApplicationRequest) returns (Application) {} rpc GetApplication(ApplicationById) returns (Application) {} rpc UpdateApplication(UpdateApplicationRequest) returns (Application) {} + rpc AddEntitlement(ApplicationById) returns (Application) {} rpc DeleteApplication(ApplicationById) returns (ApplicationResponseMessage) {} rpc ListApplications(ApplicationByTenantName) returns (ApplicationList) {} rpc ListApplicationsByEntitlement(ApplicationById) returns (ApplicationList) {} diff --git a/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppAddEntitlementCommand.java b/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppAddEntitlementCommand.java new file mode 100644 index 0000000000..81ca86cf70 --- /dev/null +++ b/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppAddEntitlementCommand.java @@ -0,0 +1,62 @@ +/* + * Copyright 2021-2026 Open Text. + * + * The only warranties for products and services of Open Text + * and its affiliates and licensors ("Open Text") are as may + * be set forth in the express warranty statements accompanying + * such products and services. Nothing herein should be construed + * as constituting an additional warranty. Open Text shall not be + * liable for technical or editorial errors or omissions contained + * herein. The information contained herein is subject to change + * without notice. + */ +package com.fortify.cli.aviator.app.cli.cmd; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fortify.aviator.application.Application; +import com.fortify.cli.aviator._common.config.admin.helper.AviatorAdminConfigDescriptor; +import com.fortify.cli.aviator._common.exception.AviatorSimpleException; +import com.fortify.cli.aviator._common.exception.AviatorTechnicalException; +import com.fortify.cli.aviator._common.output.cli.cmd.AbstractAviatorAdminSessionOutputCommand; +import com.fortify.cli.aviator._common.util.AviatorGrpcUtils; +import com.fortify.cli.aviator._common.util.AviatorSignatureUtils; +import com.fortify.cli.aviator.grpc.AviatorGrpcClient; +import com.fortify.cli.aviator.grpc.AviatorGrpcClientHelper; +import com.fortify.cli.common.output.cli.mixin.OutputHelperMixins; +import com.fortify.cli.common.output.transform.IActionCommandResultSupplier; + +import lombok.Getter; +import picocli.CommandLine.Command; +import picocli.CommandLine.Mixin; +import picocli.CommandLine.Parameters; + +@Command(name = "add-entitlement") +public class AviatorAppAddEntitlementCommand extends AbstractAviatorAdminSessionOutputCommand implements IActionCommandResultSupplier { + @Getter @Mixin private OutputHelperMixins.TableNoQuery outputHelper; + @Parameters(index = "0") private Long applicationId; + + @Override + protected JsonNode getJsonNode(AviatorAdminConfigDescriptor configDescriptor) throws AviatorSimpleException, AviatorTechnicalException { + try (AviatorGrpcClient client = AviatorGrpcClientHelper.createClient(configDescriptor.getAviatorUrl())) { + String[] messageAndSignature = AviatorSignatureUtils.createMessageAndSignature( + configDescriptor, + configDescriptor.getTenant(), + applicationId.toString(), + "add-entitlement"); + String message = messageAndSignature[0]; + String signature = messageAndSignature[1]; + Application updatedApplication = client.addEntitlement(applicationId.toString(), signature, message, configDescriptor.getTenant()); + return AviatorGrpcUtils.grpcToJsonNode(updatedApplication); + } + } + + @Override + public boolean isSingular() { + return true; + } + + @Override + public String getActionCommandResult() { + return "UPDATED"; + } +} \ No newline at end of file diff --git a/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppCommands.java b/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppCommands.java index bc4c696c58..144ece662a 100644 --- a/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppCommands.java +++ b/fcli-core/fcli-aviator/src/main/java/com/fortify/cli/aviator/app/cli/cmd/AviatorAppCommands.java @@ -20,6 +20,7 @@ name = "app", subcommands = { AviatorAppCreateCommand.class, + AviatorAppAddEntitlementCommand.class, AviatorAppDeleteCommand.class, AviatorAppGetCommand.class, AviatorAppListCommand.class, diff --git a/fcli-core/fcli-aviator/src/main/resources/com/fortify/cli/aviator/i18n/AviatorMessages.properties b/fcli-core/fcli-aviator/src/main/resources/com/fortify/cli/aviator/i18n/AviatorMessages.properties index b41836fba1..ada98d1739 100644 --- a/fcli-core/fcli-aviator/src/main/resources/com/fortify/cli/aviator/i18n/AviatorMessages.properties +++ b/fcli-core/fcli-aviator/src/main/resources/com/fortify/cli/aviator/i18n/AviatorMessages.properties @@ -53,6 +53,10 @@ fcli.aviator.app.create.usage.header = Create a new SAST Aviator application. fcli.aviator.app.create.usage.description = Creates a new Aviator application within the tenant specified in the admin configuration. fcli.aviator.app.create.name = Name of the application to create. +fcli.aviator.app.add-entitlement.usage.header = Add one entitlement to an existing SAST Aviator application. +fcli.aviator.app.add-entitlement.usage.description = Increments an existing Aviator application's entitlement multiplier by one and returns the updated application details. +fcli.aviator.app.add-entitlement.applicationId = ID of the application to update. + fcli.aviator.app.delete.usage.header = Delete an SAST Aviator application. fcli.aviator.app.delete.usage.description = Deletes an Aviator application by its ID from the tenant specified in the admin configuration. fcli.aviator.app.delete.applicationId = ID of the application to delete. @@ -190,9 +194,10 @@ fcli.aviator.session.output.table.args = name,type,url,created,expires,expired fcli.aviator.admin-config.output.table.args = name,type,url,created fcli.aviator.ssc.audit.output.table.args = id,application.name,name,artifactId,action fcli.aviator.app.create.output.table.args = id,name,entitlement_id,disclaimer,quota_last_updated,quota +fcli.aviator.app.add-entitlement.output.table.args = id,name,entitlement_id,entitlement_multiplier,entitlements_consumed,quota_last_updated,quota fcli.aviator.app.delete.output.table.args = message -fcli.aviator.app.get.output.table.args = id,name,updated_at,quota_last_updated,quota -fcli.aviator.app.list.output.table.args = id,name,entitlement_id,created_at,quota_last_updated,quota +fcli.aviator.app.get.output.table.args = id,name,entitlement_id,entitlement_multiplier,entitlements_consumed,updated_at,quota_last_updated,quota +fcli.aviator.app.list.output.table.args = id,name,entitlement_id,entitlement_multiplier,entitlements_consumed,created_at,quota_last_updated,quota fcli.aviator.app.update.output.table.args = id,name,updated_at,quota_last_updated,quota fcli.aviator.token.create.output.table.args = token_name,start_date,expiry_date,token fcli.aviator.token.delete.output.table.args = message