blob: 6306754185e85b3cfd4518ab780535ea2592cca1 [file] [log] [blame]
// 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 com.cloud.hypervisor.ovm3.objects;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
/*
* synonym to the pool python lib in the ovs-agent
*/
public class Pool extends OvmObject {
private static final Logger LOGGER = Logger
.getLogger(Pool.class);
private final List<String> validRoles = new ArrayList<String>() {
{
add("xen");
add("utility");
}
private static final long serialVersionUID = 1L;
};
private List<String> poolHosts = new ArrayList<String>();
private final List<String> poolRoles = new ArrayList<String>();
private String poolPrimaryVip;
private String poolAlias;
private String poolId = null;
public Pool(Connection c) {
setClient(c);
}
public String getPoolPrimaryVip() {
return poolPrimaryVip;
}
public String getPoolAlias() {
return poolAlias;
}
public String getPoolId() {
return poolId;
}
public List<String> getValidRoles() {
return validRoles;
}
public Boolean isInPool(String id) throws Ovm3ResourceException {
if (poolId == null) {
discoverServerPool();
}
if (poolId == null) {
return false;
}
if (isInAPool() && poolId.equals(id)) {
return true;
}
return false;
}
public Boolean isInAPool() throws Ovm3ResourceException {
if (poolId == null) {
discoverServerPool();
}
if (poolId == null) {
return false;
}
return true;
}
private Boolean createServerPool(String alias, String id, String vip,
int num, String name, String host, List<String> roles) throws Ovm3ResourceException{
String role = StringUtils.join(roles, ",");
if (!isInAPool()) {
Object x = callWrapper("create_server_pool", alias, id, vip, num, name,
host, role);
if (x == null) {
return true;
}
return false;
} else if (isInPool(id)) {
return true;
} else {
throw new Ovm3ResourceException("Unable to add host is already in a pool with id : " + poolId);
}
}
public Boolean createServerPool(String alias, String id, String vip,
int num, String name, String ip) throws Ovm3ResourceException {
return createServerPool(alias, id, vip, num, name, ip,
getValidRoles());
}
/*
* public Boolean updatePoolVirtualIp(String ip) throws
* Ovm3ResourceException { Object x = callWrapper("update_pool_virtual_ip",
* ip); if (x == null) { poolPrimaryVip = ip; return true; } return false; }
*/
public Boolean leaveServerPool(String uuid) throws Ovm3ResourceException{
return nullIsTrueCallWrapper("leave_server_pool", uuid);
}
/**
* Ownership prior to 3.3.x used to be simpler....
* @param uuid
* @param apiurl
* @return
* @throws Ovm3ResourceException
*/
public Boolean takeOwnership(String uuid, String apiurl) throws Ovm3ResourceException {
return nullIsTrueCallWrapper("take_ownership", uuid, apiurl);
}
/**
* New style ownership, we need a dict to go in.
* manager_uuid
* manager_event_url
* manager_statistic_url
* manager_certificate
* signed_server_certificate
* @param uuid
* @param apiurl
* @return
* @throws Ovm3ResourceException
*/
public Boolean takeOwnership33x(final String uuid,
final String eventUrl,
final String statUrl,
final String managerCert,
final String signedCert) throws Ovm3ResourceException {
final Map<String, String> mgrConfig = new HashMap<String, String>() {
{
put("manager_uuid", uuid);
put("manager_event_url", eventUrl);
put("manager_statistic_url", statUrl);
put("manager_certificate", managerCert);
put("signed_server_certificate", signedCert);
}
private static final long serialVersionUID = 1L;
};
Boolean rc = nullIsTrueCallWrapper("take_ownership", mgrConfig);
/* because it restarts when it's done.... 2000? -sigh- */
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new Ovm3ResourceException(e.getMessage());
}
return rc;
}
/*
* destroy_server_pool, <class 'agent.api.serverpool.ServerPool'> argument:
* self - default: None argument: pool_uuid - default: None
*/
public Boolean destroyServerPool(String uuid) throws Ovm3ResourceException{
return nullIsTrueCallWrapper("destroy_server_pool", uuid);
}
/*
* release_ownership, <class 'agent.api.serverpool.ServerPool'> argument:
* self - default: None argument: manager_uuid - default: None
*/
public Boolean releaseOwnership(String uuid) throws Ovm3ResourceException{
return nullIsTrueCallWrapper("release_ownership", uuid);
}
/* server.discover_pool_filesystem */
/*
* discover_server_pool, <class 'agent.api.serverpool.ServerPool'> argument:
* self - default: None
*/
public Boolean discoverServerPool() throws Ovm3ResourceException {
Object x = callWrapper("discover_server_pool");
if (x == null) {
return false;
}
Document xmlDocument = prepParse((String) x);
String path = "//Discover_Server_Pool_Result/Server_Pool";
poolId = xmlToString(path + "/Unique_Id", xmlDocument);
poolAlias = xmlToString(path + "/Pool_Alias", xmlDocument);
poolPrimaryVip = xmlToString(path + "/Primary_Virtual_Ip",
xmlDocument);
poolHosts.addAll(xmlToList(path + "//Registered_IP", xmlDocument));
if (poolId == null) {
return false;
}
return true;
}
private Boolean setServerRoles() throws Ovm3ResourceException{
String roles = StringUtils.join(poolRoles.toArray(), ",");
return nullIsTrueCallWrapper("update_server_roles", roles);
}
/* do some sanity check on the valid poolroles */
public Boolean setServerRoles(List<String> roles) throws Ovm3ResourceException {
poolRoles.addAll(roles);
return setServerRoles();
}
private Boolean joinServerPool(String alias, String id, String vip, int num,
String name, String host, List<String> roles) throws Ovm3ResourceException{
String role = StringUtils.join(roles.toArray(), ",");
if (!isInAPool()) {
Object x = callWrapper("join_server_pool", alias, id, vip, num, name,
host, role);
if (x == null) {
return true;
}
return false;
} else if (isInPool(id)) {
return true;
} else {
throw new Ovm3ResourceException("Unable to add host is already in a pool with id : " + poolId);
}
}
public Boolean joinServerPool(String alias, String id, String vip, int num,
String name, String host) throws Ovm3ResourceException {
return joinServerPool(alias, id, vip, num, name, host, getValidRoles());
}
private Boolean setPoolMemberList() throws Ovm3ResourceException {
// should throw exception if no poolHosts set
return nullIsTrueCallWrapper("set_pool_member_ip_list", poolHosts);
}
public List<String> getPoolMemberList() throws Ovm3ResourceException {
if (poolId == null) {
discoverServerPool();
}
return poolHosts;
}
public Boolean setPoolMemberList(List<String> hosts) throws Ovm3ResourceException {
poolHosts = new ArrayList<String>();
poolHosts.addAll(hosts);
return setPoolMemberList();
}
public Boolean addPoolMember(String host) throws Ovm3ResourceException {
getPoolMemberList();
poolHosts.add(host);
return setPoolMemberList();
}
public Boolean removePoolMember(String host) throws Ovm3ResourceException {
getPoolMemberList();
poolHosts.remove(host);
return setPoolMemberList();
}
}