/** * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.ambari.server.controller; import static org.easymock.EasyMock.anyInt; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createMockBuilder; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.createStrictMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.Resource.Type; import org.apache.ambari.server.state.Alert; import org.apache.ambari.server.state.AlertState; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Host; import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Test; import com.google.inject.Injector; /** * Tests the {@link MaintenanceStateHelper} class */ public class MaintenanceStateHelperTest { @Test public void testisOperationAllowed() throws Exception { // Tests that isOperationAllowed() falls // back to guessing req op level if operation level is not specified // explicitly Injector injector = createStrictMock(Injector.class); Cluster cluster = createMock(Cluster.class); Method isOperationAllowed = MaintenanceStateHelper.class.getDeclaredMethod( "isOperationAllowed", new Class[]{Cluster.class, Type.class, String.class, String.class, String.class}); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .addMockedMethod(isOperationAllowed) .createNiceMock(); RequestResourceFilter filter = createMock(RequestResourceFilter.class); RequestOperationLevel level = createMock(RequestOperationLevel.class); expect(level.getLevel()).andReturn(Type.Cluster); expect(maintenanceStateHelper.isOperationAllowed( anyObject(Cluster.class), anyObject(Type.class), anyObject(String.class), anyObject(String.class), anyObject(String.class))).andStubReturn(true); // Case when level is defined replay(cluster, maintenanceStateHelper, level); maintenanceStateHelper.isOperationAllowed(cluster, level, filter, "service", "component", "hostname"); verify(maintenanceStateHelper, level); maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .addMockedMethod(isOperationAllowed) .addMockedMethod("guessOperationLevel") .createNiceMock(); expect(maintenanceStateHelper.guessOperationLevel(anyObject(RequestResourceFilter.class))).andReturn(Type.Cluster); expect(maintenanceStateHelper.isOperationAllowed( anyObject(Cluster.class), anyObject(Type.class), anyObject(String.class), anyObject(String.class), anyObject(String.class))).andStubReturn(true); // Case when level is not defined replay(maintenanceStateHelper); maintenanceStateHelper.isOperationAllowed(cluster, null, filter, "service", "component", "hostname"); verify(maintenanceStateHelper); } @Test public void testHostComponentImpliedState() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .createNiceMock(); Clusters clusters = createMock(Clusters.class); Cluster cluster = createMock(Cluster.class); ServiceComponentHost sch = createMock(ServiceComponentHost.class); Service service = createNiceMock(Service.class); final Host host = createNiceMock(Host.class); expect(sch.getClusterName()).andReturn("c1").anyTimes(); expect(clusters.getCluster("c1")).andReturn(cluster).anyTimes(); expect(cluster.getClusterName()).andReturn("c1").anyTimes(); expect(cluster.getClusterId()).andReturn(1L).anyTimes(); expect(clusters.getHost("h1")).andReturn(host).anyTimes(); expect(sch.getHostName()).andReturn("h1").anyTimes(); expect(sch.getServiceName()).andReturn("HDFS").anyTimes(); expect(cluster.getService("HDFS")).andReturn(service).anyTimes(); expect(sch.getMaintenanceState()) .andReturn(MaintenanceState.ON).times(1) .andReturn(MaintenanceState.OFF).anyTimes(); expect(service.getMaintenanceState()).andReturn(MaintenanceState.ON); expect(host.getMaintenanceState(1L)).andReturn(MaintenanceState.ON); expect(service.getMaintenanceState()).andReturn(MaintenanceState.ON); expect(host.getMaintenanceState(1L)).andReturn(MaintenanceState.OFF); expect(service.getMaintenanceState()).andReturn(MaintenanceState.OFF); expect(host.getMaintenanceState(1L)).andReturn(MaintenanceState.ON); injectField(maintenanceStateHelper, clusters); replay(maintenanceStateHelper, clusters, cluster, sch, host, service); MaintenanceState state = maintenanceStateHelper.getEffectiveState(sch); Assert.assertEquals(MaintenanceState.ON, state); state = maintenanceStateHelper.getEffectiveState(sch); Assert.assertEquals(MaintenanceState.IMPLIED_FROM_SERVICE_AND_HOST, state); state = maintenanceStateHelper.getEffectiveState(sch); Assert.assertEquals(MaintenanceState.IMPLIED_FROM_SERVICE, state); state = maintenanceStateHelper.getEffectiveState(sch); Assert.assertEquals(MaintenanceState.IMPLIED_FROM_HOST, state); verify(maintenanceStateHelper, clusters, cluster, sch, host, service); } /** * Tests that the host MM state is calculated correctly for an alert. * * @throws Exception */ @Test public void testGetEffectiveStateForHostAlert() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder( MaintenanceStateHelper.class).withConstructor(injector).createNiceMock(); Clusters clusters = createMock(Clusters.class); final Host host = createNiceMock(Host.class); long clusterId = 1L; String hostName = "c6401.ambari.apache.org"; Alert alert = new Alert("foo-alert", null, "HDFS", "DATANODE", hostName, AlertState.CRITICAL); expect(host.getMaintenanceState(clusterId)).andReturn(MaintenanceState.ON).once(); expect(clusters.getHost(hostName)).andReturn(host).once(); injectField(maintenanceStateHelper, clusters); replay(maintenanceStateHelper, clusters, host); MaintenanceState state = maintenanceStateHelper.getEffectiveState(clusterId, alert); Assert.assertEquals(MaintenanceState.ON, state); verify(maintenanceStateHelper, clusters, host); } /** * Tests that the service MM state is calculated correctly for an alert. * * @throws Exception */ @Test public void testGetEffectiveStateForServiceAlert() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder( MaintenanceStateHelper.class).withConstructor(injector).createNiceMock(); Clusters clusters = createMock(Clusters.class); Cluster cluster = createMock(Cluster.class); Service service = createNiceMock(Service.class); final Host host = createNiceMock(Host.class); long clusterId = 1L; String hostName = "c6401.ambari.apache.org"; Alert alert = new Alert("foo-alert", null, "HDFS", null, hostName, AlertState.CRITICAL); expect(host.getMaintenanceState(clusterId)).andReturn(MaintenanceState.OFF).once(); expect(clusters.getHost(hostName)).andReturn(host).once(); expect(clusters.getClusterById(clusterId)).andReturn(cluster).once(); expect(cluster.getService("HDFS")).andReturn(service).once(); expect(service.getMaintenanceState()).andReturn(MaintenanceState.ON); injectField(maintenanceStateHelper, clusters); replay(maintenanceStateHelper, clusters, host, cluster, service); MaintenanceState state = maintenanceStateHelper.getEffectiveState(clusterId, alert); Assert.assertEquals(MaintenanceState.ON, state); verify(maintenanceStateHelper, clusters, host, cluster, service); } /** * Tests that the service MM state is calculated correctly for an alert which * is only for a service (such as an AGGREGATE alert). * * @throws Exception */ @Test public void testGetEffectiveStateForServiceOnlyAlert() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder( MaintenanceStateHelper.class).withConstructor(injector).createNiceMock(); Clusters clusters = createMock(Clusters.class); Cluster cluster = createMock(Cluster.class); Service service = createNiceMock(Service.class); long clusterId = 1L; Alert alert = new Alert("foo-alert", null, "HDFS", null, null, AlertState.CRITICAL); expect(clusters.getClusterById(clusterId)).andReturn(cluster).once(); expect(cluster.getService("HDFS")).andReturn(service).once(); expect(service.getMaintenanceState()).andReturn(MaintenanceState.ON); injectField(maintenanceStateHelper, clusters); replay(maintenanceStateHelper, clusters, cluster, service); MaintenanceState state = maintenanceStateHelper.getEffectiveState(clusterId, alert); Assert.assertEquals(MaintenanceState.ON, state); verify(maintenanceStateHelper, clusters, cluster, service); } /** * Tests that the service MM state is calculated correctly for an alert. * * @throws Exception */ @Test public void testGetEffectiveStateForComponentAlert() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder( MaintenanceStateHelper.class).withConstructor(injector).createNiceMock(); Clusters clusters = createMock(Clusters.class); Cluster cluster = createMock(Cluster.class); Service service = createNiceMock(Service.class); ServiceComponent serviceComponent = createMock(ServiceComponent.class); ServiceComponentHost sch = createMock(ServiceComponentHost.class); final Host host = createNiceMock(Host.class); long clusterId = 1L; String hostName = "c6401.ambari.apache.org"; Alert alert = new Alert("foo-alert", null, "HDFS", "DATANODE", hostName, AlertState.CRITICAL); expect(host.getMaintenanceState(clusterId)).andReturn(MaintenanceState.OFF).once(); expect(clusters.getHost(hostName)).andReturn(host).once(); expect(clusters.getClusterById(clusterId)).andReturn(cluster).once(); expect(cluster.getService("HDFS")).andReturn(service).once(); expect(service.getMaintenanceState()).andReturn(MaintenanceState.OFF); expect(service.getServiceComponent("DATANODE")).andReturn(serviceComponent).once(); expect(serviceComponent.getServiceComponentHost(hostName)).andReturn(sch).once(); expect(sch.getMaintenanceState()).andReturn(MaintenanceState.ON).once(); injectField(maintenanceStateHelper, clusters); replay(maintenanceStateHelper, clusters, host, cluster, service, serviceComponent, sch); MaintenanceState state = maintenanceStateHelper.getEffectiveState(clusterId, alert); Assert.assertEquals(MaintenanceState.ON, state); verify(maintenanceStateHelper, clusters, host, cluster, service, serviceComponent, sch); } @Test public void testServiceOperationsAllowance() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .createNiceMock(); Service service = createMock(Service.class); // only called for Cluster level expect(service.getMaintenanceState()).andReturn(MaintenanceState.ON); expect(service.getMaintenanceState()).andReturn(MaintenanceState.OFF); replay(maintenanceStateHelper, service); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, service)); verify(maintenanceStateHelper, service); } @Test public void testHostOperationsAllowance() throws Exception { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .createNiceMock(); Host host = createMock(Host.class); // only called for Cluster level expect(host.getMaintenanceState(anyInt())).andReturn(MaintenanceState.ON); expect(host.getMaintenanceState(anyInt())).andReturn(MaintenanceState.OFF); replay(maintenanceStateHelper, host); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Cluster)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Host)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.HostComponent)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Cluster)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Service)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.Host)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(host, 1, Resource.Type.HostComponent)); verify(maintenanceStateHelper, host); } @Test public void testHostComponentOperationsAllowance() throws Exception { Injector injector = createStrictMock(Injector.class); Method getEffectiveState = MaintenanceStateHelper.class.getMethod("getEffectiveState", new Class[]{ServiceComponentHost.class}); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .addMockedMethod(getEffectiveState) .createNiceMock(); ServiceComponentHost sch = createMock(ServiceComponentHost.class); // Cluster expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.ON); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE_AND_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.OFF); // Service expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.ON); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE_AND_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.OFF); // Host expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.ON); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE_AND_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.OFF); // HostComponent expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.ON); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.IMPLIED_FROM_SERVICE_AND_HOST); expect(maintenanceStateHelper.getEffectiveState(anyObject(ServiceComponentHost.class))).andReturn(MaintenanceState.OFF); replay(maintenanceStateHelper, sch); // Cluster Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, sch)); // Service Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, sch)); Assert.assertEquals(false , maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Service, sch)); // Host Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, sch)); Assert.assertEquals(false, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.Host, sch)); // HostComponent Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, sch)); Assert.assertEquals(true, maintenanceStateHelper.isOperationAllowed(Resource.Type.HostComponent, sch)); verify(maintenanceStateHelper, sch); } @Test public void testGuessOperationLevel() { Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .createNiceMock(); replay(maintenanceStateHelper); Assert.assertEquals(Resource.Type.Cluster, maintenanceStateHelper.guessOperationLevel(null)); RequestResourceFilter resourceFilter = new RequestResourceFilter(null, null, null); Assert.assertEquals(Resource.Type.Cluster, maintenanceStateHelper.guessOperationLevel(resourceFilter)); resourceFilter = new RequestResourceFilter("HDFS", null, null); Assert.assertEquals(Resource.Type.Service, maintenanceStateHelper.guessOperationLevel(resourceFilter)); resourceFilter = new RequestResourceFilter("HDFS", "NAMENODE", null); Assert.assertEquals(Resource.Type.Service, maintenanceStateHelper.guessOperationLevel(resourceFilter)); ArrayList<String> hosts = new ArrayList<>(); hosts.add("host1"); hosts.add("host2"); resourceFilter = new RequestResourceFilter("HDFS", null, hosts); Assert.assertEquals(Resource.Type.Cluster, maintenanceStateHelper.guessOperationLevel(resourceFilter)); resourceFilter = new RequestResourceFilter(null, null, hosts); Assert.assertEquals(Resource.Type.Host, maintenanceStateHelper.guessOperationLevel(resourceFilter)); resourceFilter = new RequestResourceFilter("HDFS", "NAMENODE", hosts); Assert.assertEquals(Resource.Type.HostComponent, maintenanceStateHelper.guessOperationLevel(resourceFilter)); } @Test public void testCutOffHosts() throws AmbariException { MaintenanceStateHelper.HostPredicate predicate = createMock(MaintenanceStateHelper.HostPredicate.class); expect(predicate.shouldHostBeRemoved(eq("host1"))).andReturn(true); expect(predicate.shouldHostBeRemoved(eq("host2"))).andReturn(false); expect(predicate.shouldHostBeRemoved(eq("host3"))).andReturn(true); expect(predicate.shouldHostBeRemoved(eq("host4"))).andReturn(false); Set<String> candidates = new HashSet<>(); candidates.add("host1"); candidates.add("host2"); candidates.add("host3"); candidates.add("host4"); Injector injector = createStrictMock(Injector.class); MaintenanceStateHelper maintenanceStateHelper = createMockBuilder(MaintenanceStateHelper.class) .withConstructor(injector) .createNiceMock(); replay(predicate, maintenanceStateHelper); Set<String> ignored = maintenanceStateHelper.filterHostsInMaintenanceState(candidates, predicate); verify(predicate, maintenanceStateHelper); Assert.assertEquals(candidates.size(), 2); Assert.assertTrue(candidates.contains("host2")); Assert.assertTrue(candidates.contains("host4")); Assert.assertEquals(ignored.size(), 2); Assert.assertTrue(ignored.contains("host1")); Assert.assertTrue(ignored.contains("host3")); } private static void injectField(MaintenanceStateHelper maintenanceStateHelper, Clusters clusters) throws NoSuchFieldException, IllegalAccessException { Class<?> maintenanceHelperClass = MaintenanceStateHelper.class; Field f = maintenanceHelperClass.getDeclaredField("clusters"); f.setAccessible(true); f.set(maintenanceStateHelper, clusters); } public static MaintenanceStateHelper getMaintenanceStateHelperInstance( Clusters clusters) throws NoSuchFieldException, IllegalAccessException { Injector injector = createNiceMock(Injector.class); injector.injectMembers(anyObject(MaintenanceStateHelper.class)); EasyMock.expectLastCall().once(); replay(injector); MaintenanceStateHelper maintenanceStateHelper = new MaintenanceStateHelper(injector); injectField(maintenanceStateHelper, clusters); return maintenanceStateHelper; } }