blob: b685711416a3f48decf3a18da4a332b3be0b38bb [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.ozone.om.request.volume;
import java.util.UUID;
import org.apache.hadoop.ozone.om.response.volume.OMVolumeCreateResponse;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.Assert;
import org.junit.Test;
import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
import org.apache.hadoop.ozone.om.request.TestOMRequestUtils;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.CreateVolumeRequest;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMRequest;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.VolumeInfo;
import static org.mockito.Mockito.when;
/**
* Tests create volume request.
*/
public class TestOMVolumeCreateRequest extends TestOMVolumeRequest {
@Test
public void testPreExecute() throws Exception {
String volumeName = UUID.randomUUID().toString();
String adminName = UUID.randomUUID().toString();
String ownerName = UUID.randomUUID().toString();
doPreExecute(volumeName, adminName, ownerName);
}
@Test
public void testValidateAndUpdateCacheWithZeroMaxUserVolumeCount()
throws Exception {
when(ozoneManager.getMaxUserVolumeCount()).thenReturn(0L);
String volumeName = UUID.randomUUID().toString();
String adminName = "user1";
String ownerName = "user1";
OMRequest originalRequest = createVolumeRequest(volumeName, adminName,
ownerName);
OMVolumeCreateRequest omVolumeCreateRequest =
new OMVolumeCreateRequest(originalRequest);
omVolumeCreateRequest.preExecute(ozoneManager);
try {
OMClientResponse omClientResponse =
omVolumeCreateRequest.validateAndUpdateCache(ozoneManager, 1,
ozoneManagerDoubleBufferHelper);
Assert.assertTrue(omClientResponse instanceof OMVolumeCreateResponse);
OMVolumeCreateResponse respone =
(OMVolumeCreateResponse) omClientResponse;
Assert.assertEquals(1, respone.getOmVolumeArgs().getObjectID());
Assert.assertEquals(1, respone.getOmVolumeArgs().getUpdateID());
} catch (IllegalArgumentException ex){
GenericTestUtils.assertExceptionContains("should be greater than zero",
ex);
}
}
@Test
public void testValidateAndUpdateCacheSuccess() throws Exception {
String volumeName = UUID.randomUUID().toString();
String adminName = "user1";
String ownerName = "user1";
OMRequest originalRequest = createVolumeRequest(volumeName, adminName,
ownerName);
OMVolumeCreateRequest omVolumeCreateRequest =
new OMVolumeCreateRequest(originalRequest);
OMRequest modifiedRequest = omVolumeCreateRequest.preExecute(ozoneManager);
String volumeKey = omMetadataManager.getVolumeKey(volumeName);
String ownerKey = omMetadataManager.getUserKey(ownerName);
// As we have not still called validateAndUpdateCache, get() should
// return null.
Assert.assertNull(omMetadataManager.getVolumeTable().get(volumeKey));
Assert.assertNull(omMetadataManager.getUserTable().get(ownerKey));
omVolumeCreateRequest = new OMVolumeCreateRequest(modifiedRequest);
OMClientResponse omClientResponse =
omVolumeCreateRequest.validateAndUpdateCache(ozoneManager, 2,
ozoneManagerDoubleBufferHelper);
OzoneManagerProtocolProtos.OMResponse omResponse =
omClientResponse.getOMResponse();
Assert.assertNotNull(omResponse.getCreateVolumeResponse());
Assert.assertEquals(OzoneManagerProtocolProtos.Status.OK,
omResponse.getStatus());
// Get volumeInfo from request.
VolumeInfo volumeInfo = omVolumeCreateRequest.getOmRequest()
.getCreateVolumeRequest().getVolumeInfo();
OmVolumeArgs omVolumeArgs =
omMetadataManager.getVolumeTable().get(volumeKey);
// As request is valid volume table should not have entry.
Assert.assertNotNull(omVolumeArgs);
Assert.assertEquals(2, omVolumeArgs.getObjectID());
Assert.assertEquals(2, omVolumeArgs.getUpdateID());
// Check data from table and request.
Assert.assertEquals(volumeInfo.getVolume(), omVolumeArgs.getVolume());
Assert.assertEquals(volumeInfo.getOwnerName(), omVolumeArgs.getOwnerName());
Assert.assertEquals(volumeInfo.getAdminName(), omVolumeArgs.getAdminName());
Assert.assertEquals(volumeInfo.getCreationTime(),
omVolumeArgs.getCreationTime());
OzoneManagerProtocolProtos.UserVolumeInfo userVolumeInfo = omMetadataManager
.getUserTable().get(ownerKey);
Assert.assertNotNull(userVolumeInfo);
Assert.assertEquals(volumeName, userVolumeInfo.getVolumeNames(0));
// Create another volume for the user.
originalRequest = createVolumeRequest("vol1", adminName,
ownerName);
omVolumeCreateRequest =
new OMVolumeCreateRequest(originalRequest);
modifiedRequest = omVolumeCreateRequest.preExecute(ozoneManager);
omClientResponse =
omVolumeCreateRequest.validateAndUpdateCache(ozoneManager, 2L,
ozoneManagerDoubleBufferHelper);
Assert.assertEquals(OzoneManagerProtocolProtos.Status.OK,
omClientResponse.getOMResponse().getStatus());
Assert.assertTrue(omMetadataManager
.getUserTable().get(ownerKey).getVolumeNamesList().size() == 2);
}
@Test
public void testValidateAndUpdateCacheWithVolumeAlreadyExists()
throws Exception {
String volumeName = UUID.randomUUID().toString();
String adminName = "user1";
String ownerName = "user1";
TestOMRequestUtils.addVolumeToDB(volumeName, omMetadataManager);
OMRequest originalRequest = createVolumeRequest(volumeName, adminName,
ownerName);
OMVolumeCreateRequest omVolumeCreateRequest =
new OMVolumeCreateRequest(originalRequest);
OMRequest modifiedRequest = omVolumeCreateRequest.preExecute(ozoneManager);
omVolumeCreateRequest = new OMVolumeCreateRequest(modifiedRequest);
OMClientResponse omClientResponse =
omVolumeCreateRequest.validateAndUpdateCache(ozoneManager, 1,
ozoneManagerDoubleBufferHelper);
OzoneManagerProtocolProtos.OMResponse omResponse =
omClientResponse.getOMResponse();
Assert.assertNotNull(omResponse.getCreateVolumeResponse());
Assert.assertEquals(OzoneManagerProtocolProtos.Status.VOLUME_ALREADY_EXISTS,
omResponse.getStatus());
// Check really if we have a volume with the specified volume name.
Assert.assertNotNull(omMetadataManager.getVolumeTable().get(
omMetadataManager.getVolumeKey(volumeName)));
}
private void doPreExecute(String volumeName,
String adminName, String ownerName) throws Exception {
OMRequest originalRequest = createVolumeRequest(volumeName, adminName,
ownerName);
OMVolumeCreateRequest omVolumeCreateRequest =
new OMVolumeCreateRequest(originalRequest);
OMRequest modifiedRequest = omVolumeCreateRequest.preExecute(ozoneManager);
verifyRequest(modifiedRequest, originalRequest);
}
/**
* Verify modifiedOmRequest and originalRequest.
* @param modifiedRequest
* @param originalRequest
*/
private void verifyRequest(OMRequest modifiedRequest,
OMRequest originalRequest) {
VolumeInfo original = originalRequest.getCreateVolumeRequest()
.getVolumeInfo();
VolumeInfo updated = modifiedRequest.getCreateVolumeRequest()
.getVolumeInfo();
Assert.assertEquals(original.getAdminName(), updated.getAdminName());
Assert.assertEquals(original.getVolume(), updated.getVolume());
Assert.assertEquals(original.getOwnerName(),
updated.getOwnerName());
Assert.assertNotEquals(original.getCreationTime(),
updated.getCreationTime());
}
/**
* Create OMRequest for create volume.
* @param volumeName
* @param adminName
* @param ownerName
* @return OMRequest
*/
private OMRequest createVolumeRequest(String volumeName, String adminName,
String ownerName) {
VolumeInfo volumeInfo = VolumeInfo.newBuilder().setVolume(volumeName)
.setAdminName(adminName).setOwnerName(ownerName).build();
CreateVolumeRequest createVolumeRequest =
CreateVolumeRequest.newBuilder().setVolumeInfo(volumeInfo).build();
return OMRequest.newBuilder().setClientId(UUID.randomUUID().toString())
.setCmdType(OzoneManagerProtocolProtos.Type.CreateVolume)
.setCreateVolumeRequest(createVolumeRequest).build();
}
}