forked from apache/cloudstack
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request apache#1502 from shapeblue/outofband-master
CLOUDSTACK-9299: Out-of-band Management for CloudStackSupport access to a hosts out-of-band management interface (e.g. IPMI, iLO, DRAC, etc.) to manage host power operations (on/off etc.) and querying current power state in CloudStack. Given the wide range of out-of-band management interfaces such as iLO and iDRA, the service implementation allows for development of separate drivers as plugins. This feature comes with a ipmitool based driver that uses the ipmitool (http:https://linux.die.net/man/1/ipmitool) to communicate with any out-of-band management interface that support IPMI 2.0. This feature allows following common use-cases: - Restarting stalled/failed hosts - Powering off under-utilised hosts - Powering on hosts for provisioning or to increase capacity - Allowing system administrators to see the current power state of the host For testing this feature, please install `ipmitool` (using yum/apt/brew) and `ipmisim`: https://pypi.python.org/pypi/ipmisim The default ipmitool location is assumed in /usr/bin, if this is different in your env please fix the global setting, see FS for details on various global settings. FS: https://cwiki.apache.org/confluence/display/CLOUDSTACK/Out-of-band+Management+for+CloudStack /cc @jburwell @swill @abhinandanprateek @murali-reddy @borisstoyanov * pr/1502: maven: ignore utils/testsmallfileinactive for rat checking CLOUDSTACK-9378: Fix for apache#1497 HypervisorUtilsTest: increate timeout to 8seconds travis: Use patched version of ipmitool for tests CLOUDSTACK-9299: Out-of-band Management for CloudStack Signed-off-by: Will Stevens <[email protected]>
- Loading branch information
Showing
83 changed files
with
5,249 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
112 changes: 112 additions & 0 deletions
112
...loudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
// 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:https://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.cloudstack.api.command.admin.outofbandmanagement; | ||
|
||
import com.cloud.event.EventTypes; | ||
import com.cloud.exception.ConcurrentOperationException; | ||
import com.cloud.exception.InsufficientCapacityException; | ||
import com.cloud.exception.NetworkRuleConflictException; | ||
import com.cloud.exception.ResourceAllocationException; | ||
import com.cloud.exception.ResourceUnavailableException; | ||
import com.cloud.host.Host; | ||
import com.google.common.base.Strings; | ||
import org.apache.cloudstack.acl.RoleType; | ||
import org.apache.cloudstack.api.APICommand; | ||
import org.apache.cloudstack.api.ApiArgValidator; | ||
import org.apache.cloudstack.api.ApiConstants; | ||
import org.apache.cloudstack.api.ApiErrorCode; | ||
import org.apache.cloudstack.api.BaseAsyncCmd; | ||
import org.apache.cloudstack.api.BaseCmd; | ||
import org.apache.cloudstack.api.Parameter; | ||
import org.apache.cloudstack.api.ServerApiException; | ||
import org.apache.cloudstack.api.response.HostResponse; | ||
import org.apache.cloudstack.api.response.OutOfBandManagementResponse; | ||
import org.apache.cloudstack.context.CallContext; | ||
import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementService; | ||
|
||
import javax.inject.Inject; | ||
|
||
@APICommand(name = ChangeOutOfBandManagementPasswordCmd.APINAME, description = "Changes out-of-band management interface password on the host and updates the interface configuration in CloudStack if the operation succeeds, else reverts the old password", | ||
responseObject = OutOfBandManagementResponse.class, requestHasSensitiveInfo = true, responseHasSensitiveInfo = false, | ||
since = "4.9.0", authorized = {RoleType.Admin}) | ||
public class ChangeOutOfBandManagementPasswordCmd extends BaseAsyncCmd { | ||
public static final String APINAME = "changeOutOfBandManagementPassword"; | ||
|
||
@Inject | ||
private OutOfBandManagementService outOfBandManagementService; | ||
|
||
///////////////////////////////////////////////////// | ||
//////////////// API parameters ///////////////////// | ||
///////////////////////////////////////////////////// | ||
|
||
@Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, required = true, | ||
validations = {ApiArgValidator.PositiveNumber}, description = "the ID of the host") | ||
private Long hostId; | ||
|
||
@Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "the new host management interface password of maximum length 16, if none is provided a random password would be used") | ||
private String password; | ||
|
||
///////////////////////////////////////////////////// | ||
/////////////// API Implementation/////////////////// | ||
///////////////////////////////////////////////////// | ||
|
||
@Override | ||
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { | ||
final Host host = _resourceService.getHost(getHostId()); | ||
if (host == null) { | ||
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); | ||
} | ||
|
||
CallContext.current().setEventDetails("Host Id: " + host.getId() + " Password: " + getPassword().charAt(0) + "****"); | ||
CallContext.current().putContextParameter(Host.class, host.getUuid()); | ||
|
||
final OutOfBandManagementResponse response = outOfBandManagementService.changeOutOfBandManagementPassword(host, getPassword()); | ||
response.setResponseName(getCommandName()); | ||
setResponseObject(response); | ||
} | ||
|
||
@Override | ||
public String getCommandName() { | ||
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; | ||
} | ||
|
||
@Override | ||
public long getEntityOwnerId() { | ||
return CallContext.current().getCallingAccountId(); | ||
} | ||
|
||
public Long getHostId() { | ||
return hostId; | ||
} | ||
|
||
public String getPassword() { | ||
if (Strings.isNullOrEmpty(password)) { | ||
password = _mgr.generateRandomPassword(); | ||
} | ||
return password; | ||
} | ||
|
||
@Override | ||
public String getEventType() { | ||
return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD; | ||
} | ||
|
||
@Override | ||
public String getEventDescription() { | ||
return "change out-of-band management password for host: " + getHostId(); | ||
} | ||
} |
Oops, something went wrong.