Skip to content

Commit 269efb5

Browse files
feeblefakiejnmt
andauthored
Backport to branch(3) : Add namespace-creation feature (#344)
Co-authored-by: Jun Nemoto <35618893+jnmt@users.noreply.github.com>
1 parent 313d61d commit 269efb5

File tree

41 files changed

+1412
-18
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1412
-18
lines changed

client/src/main/java/com/scalar/dl/client/error/ClientError.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public enum ClientError implements ScalarDlError {
102102
"The specified keys are incorrect for the asset type.",
103103
"",
104104
""),
105+
SERVICE_NAMESPACE_NAME_CANNOT_BE_NULL(
106+
StatusCode.INVALID_ARGUMENT, "025", "The namespace name cannot be null.", "", ""),
105107

106108
//
107109
// Errors for RUNTIME_ERROR(502)

client/src/main/java/com/scalar/dl/client/service/AuditorClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.scalar.dl.rpc.ContractsListingRequest;
1717
import com.scalar.dl.rpc.ExecutionOrderingResponse;
1818
import com.scalar.dl.rpc.ExecutionValidationRequest;
19+
import com.scalar.dl.rpc.NamespaceCreationRequest;
1920
import com.scalar.dl.rpc.SecretRegistrationRequest;
2021
import io.grpc.ManagedChannel;
2122
import io.grpc.netty.NettyChannelBuilder;
@@ -137,6 +138,17 @@ public ContractExecutionResponse validate(ExecutionValidationRequest request) {
137138
return ContractExecutionResponse.getDefaultInstance();
138139
}
139140

141+
@Override
142+
public void create(NamespaceCreationRequest request) {
143+
ThrowableConsumer<NamespaceCreationRequest> f =
144+
r -> getAuditorPrivilegedStub().createNamespace(r);
145+
try {
146+
accept(f, request);
147+
} catch (Exception e) {
148+
throwExceptionWithStatusCode(e);
149+
}
150+
}
151+
140152
private AuditorGrpc.AuditorBlockingStub getAuditorStub() {
141153
return auditorStub.withDeadlineAfter(deadlineDurationMillis, TimeUnit.MILLISECONDS);
142154
}

client/src/main/java/com/scalar/dl/client/service/Client.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.scalar.dl.rpc.CertificateRegistrationRequest;
1010
import com.scalar.dl.rpc.ContractRegistrationRequest;
1111
import com.scalar.dl.rpc.ContractsListingRequest;
12+
import com.scalar.dl.rpc.NamespaceCreationRequest;
1213
import com.scalar.dl.rpc.SecretRegistrationRequest;
1314
import com.scalar.dl.rpc.Status;
1415
import io.grpc.Metadata;
@@ -29,6 +30,8 @@ public interface Client {
2930

3031
JsonObject list(ContractsListingRequest request);
3132

33+
void create(NamespaceCreationRequest request);
34+
3235
default <T> void accept(ThrowableConsumer<T> f, T request) {
3336
try {
3437
f.accept(request);

client/src/main/java/com/scalar/dl/client/service/ClientService.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.scalar.dl.rpc.ContractsListingRequest;
2828
import com.scalar.dl.rpc.FunctionRegistrationRequest;
2929
import com.scalar.dl.rpc.LedgerValidationRequest;
30+
import com.scalar.dl.rpc.NamespaceCreationRequest;
3031
import com.scalar.dl.rpc.SecretRegistrationRequest;
3132
import java.util.Collections;
3233
import java.util.List;
@@ -985,6 +986,41 @@ public LedgerValidationResult validateLedger(byte[] serializedBinary) {
985986
return handler.validateLedger(request);
986987
}
987988

989+
/**
990+
* Creates the specified namespace.
991+
*
992+
* @param namespace a namespace name to create
993+
* @throws ClientException if a request fails for some reason
994+
*/
995+
public void createNamespace(String namespace) {
996+
checkClientMode(ClientMode.CLIENT);
997+
checkArgument(
998+
namespace != null, ClientError.SERVICE_NAMESPACE_NAME_CANNOT_BE_NULL.buildMessage());
999+
NamespaceCreationRequest request =
1000+
NamespaceCreationRequest.newBuilder().setNamespace(namespace).build();
1001+
1002+
handler.createNamespace(request);
1003+
}
1004+
1005+
/**
1006+
* Creates the namespace specified with the serialized byte array of a {@code
1007+
* NamespaceCreationRequest}.
1008+
*
1009+
* @param serializedBinary a serialized byte array of {@code NamespaceCreationRequest}
1010+
* @throws ClientException if a request fails for some reason
1011+
*/
1012+
public void createNamespace(byte[] serializedBinary) {
1013+
checkClientMode(ClientMode.INTERMEDIARY);
1014+
NamespaceCreationRequest request;
1015+
try {
1016+
request = NamespaceCreationRequest.parseFrom(serializedBinary);
1017+
} catch (InvalidProtocolBufferException e) {
1018+
throw new IllegalArgumentException(e.getMessage(), e);
1019+
}
1020+
1021+
handler.createNamespace(request);
1022+
}
1023+
9881024
/**
9891025
* It does nothing now. It's left here for backward compatibility.
9901026
*

client/src/main/java/com/scalar/dl/client/service/ClientServiceHandler.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.scalar.dl.rpc.ContractsListingRequest;
1010
import com.scalar.dl.rpc.FunctionRegistrationRequest;
1111
import com.scalar.dl.rpc.LedgerValidationRequest;
12+
import com.scalar.dl.rpc.NamespaceCreationRequest;
1213
import com.scalar.dl.rpc.SecretRegistrationRequest;
1314
import javax.json.JsonObject;
1415

@@ -74,4 +75,6 @@ public interface ClientServiceHandler {
7475
* @throws ClientException if a request fails for some reason
7576
*/
7677
LedgerValidationResult validateLedger(LedgerValidationRequest request);
78+
79+
void createNamespace(NamespaceCreationRequest request);
7780
}

client/src/main/java/com/scalar/dl/client/service/DefaultClientServiceHandler.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.scalar.dl.rpc.ExecutionValidationRequest;
1919
import com.scalar.dl.rpc.FunctionRegistrationRequest;
2020
import com.scalar.dl.rpc.LedgerValidationRequest;
21+
import com.scalar.dl.rpc.NamespaceCreationRequest;
2122
import com.scalar.dl.rpc.SecretRegistrationRequest;
2223
import java.util.HashMap;
2324
import java.util.Map;
@@ -128,6 +129,12 @@ public LedgerValidationResult validateLedger(LedgerValidationRequest request) {
128129
return client.validate(request);
129130
}
130131

132+
@Override
133+
public void createNamespace(NamespaceCreationRequest request) {
134+
createAtAuditor(request);
135+
client.create(request);
136+
}
137+
131138
private void registerToAuditor(CertificateRegistrationRequest request) {
132139
if (auditorClient == null) {
133140
return;
@@ -167,6 +174,19 @@ private void registerToAuditor(ContractRegistrationRequest request) {
167174
}
168175
}
169176

177+
private void createAtAuditor(NamespaceCreationRequest request) {
178+
if (auditorClient == null) {
179+
return;
180+
}
181+
try {
182+
auditorClient.create(request);
183+
} catch (ClientException e) {
184+
if (!e.getStatusCode().equals(StatusCode.NAMESPACE_ALREADY_EXISTS)) {
185+
throw e;
186+
}
187+
}
188+
}
189+
170190
private ContractExecutionRequest order(ContractExecutionRequest request) {
171191
if (auditorClient == null) {
172192
return request;

client/src/main/java/com/scalar/dl/client/service/GatewayClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.scalar.dl.rpc.GatewayPrivilegedGrpc;
2323
import com.scalar.dl.rpc.LedgerValidationRequest;
2424
import com.scalar.dl.rpc.LedgerValidationResponse;
25+
import com.scalar.dl.rpc.NamespaceCreationRequest;
2526
import com.scalar.dl.rpc.SecretRegistrationRequest;
2627
import io.grpc.ManagedChannel;
2728
import io.grpc.netty.NettyChannelBuilder;
@@ -183,6 +184,17 @@ public LedgerValidationResult validate(LedgerValidationRequest request) {
183184
return new LedgerValidationResult(StatusCode.RUNTIME_ERROR, null, null);
184185
}
185186

187+
@Override
188+
public void create(NamespaceCreationRequest request) {
189+
ThrowableConsumer<NamespaceCreationRequest> f =
190+
r -> getGatewayPrivilegedStub().createNamespace(r);
191+
try {
192+
accept(f, request);
193+
} catch (Exception e) {
194+
throwExceptionWithStatusCode(e);
195+
}
196+
}
197+
186198
private GatewayGrpc.GatewayBlockingStub getGatewayStub() {
187199
return gatewayStub.withDeadlineAfter(deadlineDurationMillis, TimeUnit.MILLISECONDS);
188200
}

client/src/main/java/com/scalar/dl/client/service/GatewayClientServiceHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.scalar.dl.rpc.ContractsListingRequest;
1111
import com.scalar.dl.rpc.FunctionRegistrationRequest;
1212
import com.scalar.dl.rpc.LedgerValidationRequest;
13+
import com.scalar.dl.rpc.NamespaceCreationRequest;
1314
import com.scalar.dl.rpc.SecretRegistrationRequest;
1415
import javax.json.JsonObject;
1516

@@ -108,6 +109,11 @@ public LedgerValidationResult validateLedger(LedgerValidationRequest request) {
108109
return client.validate(request);
109110
}
110111

112+
@Override
113+
public void createNamespace(NamespaceCreationRequest request) {
114+
client.create(request);
115+
}
116+
111117
@VisibleForTesting
112118
AbstractGatewayClient getGatewayClient() {
113119
return client;

client/src/main/java/com/scalar/dl/client/service/LedgerClient.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.scalar.dl.rpc.LedgerPrivilegedGrpc;
2929
import com.scalar.dl.rpc.LedgerValidationRequest;
3030
import com.scalar.dl.rpc.LedgerValidationResponse;
31+
import com.scalar.dl.rpc.NamespaceCreationRequest;
3132
import com.scalar.dl.rpc.SecretRegistrationRequest;
3233
import io.grpc.ManagedChannel;
3334
import io.grpc.netty.NettyChannelBuilder;
@@ -230,6 +231,17 @@ public TransactionState abort(ExecutionAbortRequest request) {
230231
return TransactionState.UNKNOWN;
231232
}
232233

234+
@Override
235+
public void create(NamespaceCreationRequest request) {
236+
ThrowableConsumer<NamespaceCreationRequest> f =
237+
r -> getLedgerPrivilegedStub().createNamespace(r);
238+
try {
239+
accept(f, request);
240+
} catch (Exception e) {
241+
throwExceptionWithStatusCode(e);
242+
}
243+
}
244+
233245
private LedgerGrpc.LedgerBlockingStub getLedgerStub() {
234246
return ledgerStub.withDeadlineAfter(deadlineDurationMillis, TimeUnit.MILLISECONDS);
235247
}

client/src/test/java/com/scalar/dl/client/service/ClientServiceTest.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,4 +724,95 @@ public void validateLedger_SerializedBinaryGiven_ShouldValidateProperly() {
724724
verify(config, never()).getHmacIdentityConfig();
725725
verify(signer, never()).sign(any(LedgerValidationRequest.Builder.class));
726726
}
727+
728+
@Test
729+
public void createNamespace_CorrectInputsGiven_ShouldCreateNamespaceProperly() {
730+
// Arrange
731+
when(config.getClientMode()).thenReturn(ClientMode.CLIENT);
732+
String namespace = "test_namespace";
733+
734+
// Act
735+
service.createNamespace(namespace);
736+
737+
// Assert
738+
com.scalar.dl.rpc.NamespaceCreationRequest expected =
739+
com.scalar.dl.rpc.NamespaceCreationRequest.newBuilder().setNamespace(namespace).build();
740+
verify(handler).createNamespace(expected);
741+
}
742+
743+
@Test
744+
public void createNamespace_NullNamespaceGiven_ShouldThrowIllegalArgumentException() {
745+
// Arrange
746+
when(config.getClientMode()).thenReturn(ClientMode.CLIENT);
747+
748+
// Act
749+
Throwable thrown = catchThrowable(() -> service.createNamespace((String) null));
750+
751+
// Assert
752+
assertThat(thrown).isExactlyInstanceOf(IllegalArgumentException.class);
753+
verify(handler, never()).createNamespace(any(com.scalar.dl.rpc.NamespaceCreationRequest.class));
754+
}
755+
756+
@Test
757+
public void
758+
createNamespace_NamespaceNameWithIntermediaryModeGiven_ShouldThrowIllegalArgumentException() {
759+
// Arrange
760+
when(config.getClientMode()).thenReturn(ClientMode.INTERMEDIARY);
761+
String namespace = "test_namespace";
762+
763+
// Act
764+
Throwable thrown = catchThrowable(() -> service.createNamespace(namespace));
765+
766+
// Assert
767+
assertThat(thrown).isExactlyInstanceOf(IllegalArgumentException.class);
768+
verify(handler, never()).createNamespace(any(com.scalar.dl.rpc.NamespaceCreationRequest.class));
769+
}
770+
771+
@Test
772+
public void createNamespace_SerializedBinaryGiven_ShouldCreateNamespaceProperly() {
773+
// Arrange
774+
when(config.getClientMode()).thenReturn(ClientMode.INTERMEDIARY);
775+
com.scalar.dl.rpc.NamespaceCreationRequest expected =
776+
com.scalar.dl.rpc.NamespaceCreationRequest.newBuilder()
777+
.setNamespace("test_namespace")
778+
.build();
779+
780+
// Act
781+
service.createNamespace(expected.toByteArray());
782+
783+
// Assert
784+
verify(handler).createNamespace(expected);
785+
}
786+
787+
@Test
788+
public void createNamespace_InvalidSerializedBinaryGiven_ShouldThrowIllegalArgumentException() {
789+
// Arrange
790+
when(config.getClientMode()).thenReturn(ClientMode.INTERMEDIARY);
791+
byte[] invalidBinary = "invalid".getBytes(StandardCharsets.UTF_8);
792+
793+
// Act
794+
Throwable thrown = catchThrowable(() -> service.createNamespace(invalidBinary));
795+
796+
// Assert
797+
assertThat(thrown).isExactlyInstanceOf(IllegalArgumentException.class);
798+
verify(handler, never()).createNamespace(any(com.scalar.dl.rpc.NamespaceCreationRequest.class));
799+
}
800+
801+
@Test
802+
public void
803+
createNamespace_SerializedBinaryClientModeGiven_ShouldThrowIllegalArgumentException() {
804+
// Arrange
805+
when(config.getClientMode()).thenReturn(ClientMode.CLIENT);
806+
com.scalar.dl.rpc.NamespaceCreationRequest request =
807+
com.scalar.dl.rpc.NamespaceCreationRequest.newBuilder()
808+
.setNamespace("test_namespace")
809+
.build();
810+
811+
// Act
812+
Throwable thrown = catchThrowable(() -> service.createNamespace(request.toByteArray()));
813+
814+
// Assert
815+
assertThat(thrown).isExactlyInstanceOf(IllegalArgumentException.class);
816+
verify(handler, never()).createNamespace(any(com.scalar.dl.rpc.NamespaceCreationRequest.class));
817+
}
727818
}

0 commit comments

Comments
 (0)