/*
 * 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.slider.server.appmaster.model.appstate

import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.apache.hadoop.yarn.api.records.Container
import org.apache.hadoop.yarn.client.api.AMRMClient
import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest
import org.apache.slider.server.appmaster.model.mock.MockRoles
import org.apache.slider.server.appmaster.operations.AbstractRMOperation
import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation
import org.apache.slider.server.appmaster.operations.ContainerRequestOperation
import org.apache.slider.server.appmaster.state.ContainerAssignment
import org.apache.slider.server.appmaster.state.RoleHistoryUtils
import org.apache.slider.server.appmaster.state.RoleInstance
import org.junit.Test

import static org.apache.slider.server.appmaster.state.ContainerPriority.extractRole

/**
 * Test that the app state lets you ask for nodes, get a specific host,
 * release it and then get that one back again.
 */
@CompileStatic
@Slf4j
class TestMockAppStateRolePlacement extends BaseMockAppStateTest
    implements MockRoles {

  @Override
  String getTestName() {
    return "TestMockAppStateRolePlacement"
  }


  @Test
  public void testAllocateReleaseRealloc() throws Throwable {
    role0Status.desired = 1

    List<AbstractRMOperation> ops = appState.reviewRequestAndReleaseNodes()
    ContainerRequestOperation operation = (ContainerRequestOperation) ops[0]
    AMRMClient.ContainerRequest request = operation.request
    assert request.relaxLocality
    assert request.nodes == null
    assert request.racks == null

    Container allocated = engine.allocateContainer(request)
    List<ContainerAssignment> assignments = [];
    List<AbstractRMOperation> operations = []
    appState.onContainersAllocated([(Container)allocated], assignments, operations)
    assert operations.size() == 0
    assert assignments.size() == 1
    ContainerAssignment assigned = assignments[0]
    Container container = assigned.container
    assert container.id == allocated.id
    int roleId = assigned.role.priority
    assert roleId == extractRole(request.priority)
    assert assigned.role.name == ROLE0
    String containerHostname = RoleHistoryUtils.hostnameOf(container);
    RoleInstance ri = roleInstance(assigned)
    //tell the app it arrived
    appState.containerStartSubmitted(container, ri);
    assert appState.onNodeManagerContainerStarted(container.id)
    assert role0Status.started == 1
    ops = appState.reviewRequestAndReleaseNodes()
    assert ops.size() == 0

    //now it is surplus
    role0Status.desired = 0
    ops = appState.reviewRequestAndReleaseNodes()
    ContainerReleaseOperation release = (ContainerReleaseOperation) ops[0]
    
    assert release.containerId == container.id
    engine.execute(ops)
    assert appState.onCompletedNode(containerStatus(container)).roleInstance 

    //view the world
    appState.getRoleHistory().dump();
    
    //now ask for a new one
    role0Status.desired = 1
    ops = appState.reviewRequestAndReleaseNodes()
    assert ops.size() == 1
    operation = (ContainerRequestOperation) ops[0]
    AMRMClient.ContainerRequest request2 = operation.request
    assert request2 != null
    assert request2.nodes[0] == containerHostname
    assert request2.relaxLocality
    engine.execute(ops)

  }

}
