Skip to content

Commit 6576891

Browse files
authored
IGNITE-26966 Add permission check for rolling upgrade management (#12510)
1 parent d101ed7 commit 6576891

File tree

5 files changed

+65
-1
lines changed

5 files changed

+65
-1
lines changed

modules/control-utility/src/test/java/org/apache/ignite/internal/commandline/SecurityCommandHandlerPermissionsTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.ignite.internal.processors.security.impl.TestSecurityData;
3232
import org.apache.ignite.internal.processors.security.impl.TestSecurityPluginProvider;
3333
import org.apache.ignite.internal.util.typedef.F;
34+
import org.apache.ignite.lang.IgniteProductVersion;
3435
import org.apache.ignite.plugin.security.SecurityPermission;
3536
import org.apache.ignite.plugin.security.SecurityPermissionSet;
3637
import org.apache.ignite.plugin.security.SecurityPermissionSetBuilder;
@@ -41,11 +42,13 @@
4142
import org.junit.runners.Parameterized;
4243

4344
import static java.util.Arrays.asList;
45+
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER;
4446
import static org.apache.ignite.internal.commandline.ArgumentParser.CMD_PASSWORD;
4547
import static org.apache.ignite.internal.commandline.ArgumentParser.CMD_USER;
4648
import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK;
4749
import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR;
4850
import static org.apache.ignite.internal.util.IgniteUtils.resolveIgnitePath;
51+
import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_ROLLING_UPGRADE;
4952
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_CREATE;
5053
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_DESTROY;
5154
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_READ;
@@ -138,6 +141,40 @@ public void testCacheCreate() throws Exception {
138141
);
139142
}
140143

144+
/** */
145+
@Test
146+
public void testRollingUpgrade() throws Exception {
147+
IgniteEx ign = startGrid(
148+
0,
149+
userData(TEST_NO_PERMISSIONS_LOGIN, NO_PERMISSIONS),
150+
userData(TEST_LOGIN, systemPermissions(ADMIN_ROLLING_UPGRADE))
151+
);
152+
153+
IgniteProductVersion curVer = IgniteProductVersion.fromString(ign.localNode().attribute(ATTR_BUILD_VER));
154+
String targetVerStr = curVer.major() + "." + (curVer.minor() + 1) + ".0";
155+
156+
List<String> cmdArgs = asList("--rolling-upgrade", "enable", targetVerStr);
157+
158+
assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(enrichWithConnectionArguments(cmdArgs, TEST_NO_PERMISSIONS_LOGIN)));
159+
160+
assertFalse(ign.context().rollingUpgrade().enabled());
161+
162+
assertEquals(EXIT_CODE_OK, execute(enrichWithConnectionArguments(cmdArgs, TEST_LOGIN)));
163+
164+
assertTrue(ign.context().rollingUpgrade().enabled());
165+
assertEquals(IgniteProductVersion.fromString(targetVerStr), ign.context().rollingUpgrade().versions().get2());
166+
167+
cmdArgs = asList("--rolling-upgrade", "disable");
168+
169+
assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(enrichWithConnectionArguments(cmdArgs, TEST_NO_PERMISSIONS_LOGIN)));
170+
171+
assertTrue(ign.context().rollingUpgrade().enabled());
172+
173+
assertEquals(EXIT_CODE_OK, execute(enrichWithConnectionArguments(cmdArgs, TEST_LOGIN)));
174+
175+
assertFalse(ign.context().rollingUpgrade().enabled());
176+
}
177+
141178
/** */
142179
@Test
143180
public void testServiceCancel() throws Exception {

modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeDisableTask.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
import org.apache.ignite.internal.visor.VisorJob;
2727
import org.apache.ignite.internal.visor.VisorOneNodeTask;
2828
import org.apache.ignite.lang.IgniteProductVersion;
29+
import org.apache.ignite.plugin.security.SecurityPermissionSet;
2930

3031
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER;
32+
import static org.apache.ignite.plugin.security.SecurityPermissionSetBuilder.NO_PERMISSIONS;
3133

3234
/** Task to disable rolling upgrade. */
3335
@GridInternal
@@ -50,6 +52,13 @@ protected RollingUpgradeDisableJob(NoArg arg, boolean debug) {
5052
super(arg, debug);
5153
}
5254

55+
/** {@inheritDoc} */
56+
@Override public SecurityPermissionSet requiredPermissions() {
57+
// This task does nothing but delegate a call to the Ignite Rolling Upgrade processor, which performs user
58+
// permissions checks on its own. Therefore, it is safe to execute task without any additional permissions check.
59+
return NO_PERMISSIONS;
60+
}
61+
5362
/** {@inheritDoc} */
5463
@Override protected RollingUpgradeTaskResult run(NoArg arg) throws IgniteException {
5564
RollingUpgradeProcessor proc = ignite.context().rollingUpgrade();

modules/core/src/main/java/org/apache/ignite/internal/management/rollingupgrade/RollingUpgradeEnableTask.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import org.apache.ignite.internal.visor.VisorJob;
2626
import org.apache.ignite.internal.visor.VisorOneNodeTask;
2727
import org.apache.ignite.lang.IgniteProductVersion;
28+
import org.apache.ignite.plugin.security.SecurityPermissionSet;
29+
30+
import static org.apache.ignite.plugin.security.SecurityPermissionSetBuilder.NO_PERMISSIONS;
2831

2932
/** Task to enable rolling upgrade. */
3033
@GridInternal
@@ -47,6 +50,13 @@ protected RollingUpgradeEnableJob(RollingUpgradeEnableCommandArg arg, boolean de
4750
super(arg, debug);
4851
}
4952

53+
/** {@inheritDoc} */
54+
@Override public SecurityPermissionSet requiredPermissions() {
55+
// This task does nothing but delegate a call to the Ignite Rolling Upgrade processor, which performs user
56+
// permissions checks on its own. Therefore, it is safe to execute task without any additional permissions check.
57+
return NO_PERMISSIONS;
58+
}
59+
5060
/** {@inheritDoc} */
5161
@Override protected RollingUpgradeTaskResult run(RollingUpgradeEnableCommandArg arg) throws IgniteException {
5262
RollingUpgradeProcessor proc = ignite.context().rollingUpgrade();

modules/core/src/main/java/org/apache/ignite/internal/processors/rollingupgrade/RollingUpgradeProcessor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.ignite.internal.util.typedef.internal.LT;
3434
import org.apache.ignite.internal.util.typedef.internal.U;
3535
import org.apache.ignite.lang.IgniteProductVersion;
36+
import org.apache.ignite.plugin.security.SecurityPermission;
3637
import org.apache.ignite.spi.IgniteNodeValidationResult;
3738
import org.apache.ignite.spi.discovery.DiscoverySpi;
3839
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -166,6 +167,8 @@ public RollingUpgradeProcessor(GridKernalContext ctx) {
166167
* </ul>
167168
*/
168169
public void enable(IgniteProductVersion target, boolean force) throws IgniteCheckedException {
170+
ctx.security().authorize(SecurityPermission.ADMIN_ROLLING_UPGRADE);
171+
169172
if (startLatch.getCount() > 0)
170173
throw new IgniteCheckedException("Cannot enable rolling upgrade: processor has not been started yet");
171174

@@ -213,6 +216,8 @@ public void enable(IgniteProductVersion target, boolean force) throws IgniteChec
213216
* or metastorage is not ready.
214217
*/
215218
public void disable() throws IgniteCheckedException {
219+
ctx.security().authorize(SecurityPermission.ADMIN_ROLLING_UPGRADE);
220+
216221
if (!U.isLocalNodeCoordinator(ctx.discovery()))
217222
throw new IgniteCheckedException("Rolling upgrade can be disabled only on coordinator node");
218223

modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,10 @@ public enum SecurityPermission {
117117
SQL_VIEW_CREATE,
118118

119119
/** Permission to execute DROP VIEW command. */
120-
SQL_VIEW_DROP;
120+
SQL_VIEW_DROP,
121+
122+
/** Permission to perform rolling upgrade. */
123+
ADMIN_ROLLING_UPGRADE;
121124

122125
/** Enumerated values. */
123126
private static final SecurityPermission[] VALS = values();

0 commit comments

Comments
 (0)