Line data Source code
1 : // Copyright (C) 2020 The Android Open Source Project 2 : // 3 : // Licensed under the Apache License, Version 2.0 (the "License"); 4 : // you may not use this file except in compliance with the License. 5 : // You may obtain a copy of the License at 6 : // 7 : // http://www.apache.org/licenses/LICENSE-2.0 8 : // 9 : // Unless required by applicable law or agreed to in writing, software 10 : // distributed under the License is distributed on an "AS IS" BASIS, 11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : // See the License for the specific language governing permissions and 13 : // limitations under the License. 14 : 15 : package com.google.gerrit.server.schema; 16 : 17 : import com.google.gerrit.common.Nullable; 18 : import com.google.gerrit.entities.AccountGroup; 19 : import com.google.gerrit.entities.GroupReference; 20 : import com.google.gerrit.entities.InternalGroup; 21 : import com.google.gerrit.git.RefUpdateUtil; 22 : import com.google.gerrit.server.account.ServiceUserClassifier; 23 : import com.google.gerrit.server.config.AllUsersName; 24 : import com.google.gerrit.server.extensions.events.GitReferenceUpdated; 25 : import com.google.gerrit.server.git.meta.MetaDataUpdate; 26 : import com.google.gerrit.server.group.db.AuditLogFormatter; 27 : import com.google.gerrit.server.group.db.GroupConfig; 28 : import com.google.gerrit.server.group.db.GroupDelta; 29 : import com.google.gerrit.server.group.db.GroupNameNotes; 30 : import com.google.gerrit.server.index.group.GroupIndex; 31 : import com.google.gerrit.server.index.group.GroupIndexCollection; 32 : import java.io.IOException; 33 : import java.util.Optional; 34 : import org.eclipse.jgit.lib.BatchRefUpdate; 35 : import org.eclipse.jgit.lib.PersonIdent; 36 : import org.eclipse.jgit.lib.Repository; 37 : 38 : /** 39 : * Schema 184 for Gerrit metadata. 40 : * 41 : * <p>Upgrading to this schema version will rename the {@code Non-Interactive Users} group to {@code 42 : * Service Users}. 43 : */ 44 2 : public class Schema_184 implements NoteDbSchemaVersion { 45 : @Override 46 : public void upgrade(Arguments args, UpdateUI ui) throws Exception { 47 1 : try (Repository allUsersRepo = args.repoManager.openRepository(args.allUsers)) { 48 1 : AccountGroup.NameKey newName = AccountGroup.nameKey(ServiceUserClassifier.SERVICE_USERS); 49 1 : Optional<GroupReference> nonInteractiveUsers = 50 1 : GroupNameNotes.loadAllGroups(allUsersRepo).stream() 51 1 : .filter(g -> g.getName().equals("Non-Interactive Users")) 52 1 : .findAny(); 53 1 : if (!nonInteractiveUsers.isPresent()) { 54 1 : return; 55 : } 56 : 57 1 : GroupNameNotes newNameNotes = 58 1 : GroupNameNotes.forRename( 59 : args.allUsers, 60 : allUsersRepo, 61 1 : nonInteractiveUsers.get().getUUID(), 62 1 : AccountGroup.nameKey(nonInteractiveUsers.get().getName()), 63 : newName); 64 1 : GroupConfig groupConfig = 65 1 : GroupConfig.loadForGroup( 66 1 : args.allUsers, allUsersRepo, nonInteractiveUsers.get().getUUID()); 67 1 : groupConfig.setGroupDelta( 68 1 : GroupDelta.builder().setName(newName).build(), 69 1 : AuditLogFormatter.createPartiallyWorkingFallBack()); 70 1 : commit(args.allUsers, args.serverUser, allUsersRepo, groupConfig, newNameNotes); 71 1 : index( 72 : args.groupIndexCollection, 73 : groupConfig 74 1 : .getLoadedGroup() 75 1 : .orElseThrow( 76 0 : () -> new IllegalStateException("Created group wasn't automatically loaded"))); 77 1 : } 78 1 : } 79 : 80 : private void commit( 81 : AllUsersName allUsersName, 82 : PersonIdent serverUser, 83 : Repository allUsersRepo, 84 : GroupConfig groupConfig, 85 : GroupNameNotes groupNameNotes) 86 : throws IOException { 87 1 : BatchRefUpdate batchRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate(); 88 1 : try (MetaDataUpdate metaDataUpdate = 89 1 : createMetaDataUpdate(allUsersName, serverUser, allUsersRepo, batchRefUpdate)) { 90 1 : groupConfig.commit(metaDataUpdate); 91 : } 92 : // MetaDataUpdates unfortunately can't be reused. -> Create a new one. 93 1 : try (MetaDataUpdate metaDataUpdate = 94 1 : createMetaDataUpdate(allUsersName, serverUser, allUsersRepo, batchRefUpdate)) { 95 1 : groupNameNotes.commit(metaDataUpdate); 96 : } 97 1 : RefUpdateUtil.executeChecked(batchRefUpdate, allUsersRepo); 98 1 : } 99 : 100 : private MetaDataUpdate createMetaDataUpdate( 101 : AllUsersName allUsersName, 102 : PersonIdent serverUser, 103 : Repository allUsersRepo, 104 : @Nullable BatchRefUpdate batchRefUpdate) { 105 1 : MetaDataUpdate metaDataUpdate = 106 : new MetaDataUpdate( 107 : GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo, batchRefUpdate); 108 1 : metaDataUpdate.getCommitBuilder().setAuthor(serverUser); 109 1 : metaDataUpdate.getCommitBuilder().setCommitter(serverUser); 110 1 : return metaDataUpdate; 111 : } 112 : 113 : private void index(GroupIndexCollection indexCollection, InternalGroup group) { 114 1 : for (GroupIndex groupIndex : indexCollection.getWriteIndexes()) { 115 1 : groupIndex.replace(group); 116 1 : } 117 1 : } 118 : }