| // 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.ucs.manager; |
| |
| import org.apache.commons.httpclient.Header; |
| import org.apache.commons.httpclient.HttpClient; |
| import org.apache.commons.httpclient.URI; |
| import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory; |
| import org.apache.commons.httpclient.methods.PostMethod; |
| import org.apache.commons.httpclient.methods.StringRequestEntity; |
| import org.apache.commons.httpclient.protocol.Protocol; |
| |
| import com.cloud.utils.exception.CloudRuntimeException; |
| |
| public class UcsHttpClient { |
| private static HttpClient client = new HttpClient(); |
| private static Protocol ucsHttpsProtocol = new org.apache.commons.httpclient.protocol.Protocol("https", new EasySSLProtocolSocketFactory(), 443); |
| private final String url; |
| |
| public UcsHttpClient(String ip) { |
| url = String.format("http://%s/nuova", ip); |
| Protocol.registerProtocol("https", ucsHttpsProtocol); |
| } |
| |
| public String call(String xml) { |
| PostMethod post = new PostMethod(url); |
| post.setRequestEntity(new StringRequestEntity(xml)); |
| post.setRequestHeader("Content-type", "text/xml"); |
| //post.setFollowRedirects(true); |
| try { |
| int result = client.executeMethod(post); |
| if (result == 302) { |
| // Handle HTTPS redirect |
| // Ideal way might be to configure from add manager API |
| // for using either HTTP / HTTPS |
| // Allow only one level of redirect |
| String redirectLocation; |
| Header locationHeader = post.getResponseHeader("location"); |
| if (locationHeader != null) { |
| redirectLocation = locationHeader.getValue(); |
| } else { |
| throw new CloudRuntimeException("Call failed: Bad redirect from UCS Manager"); |
| } |
| post.setURI(new URI(redirectLocation)); |
| result = client.executeMethod(post); |
| } |
| // Check for errors |
| if (result != 200) { |
| throw new CloudRuntimeException("Call failed: " + post.getResponseBodyAsString()); |
| } |
| String res = post.getResponseBodyAsString(); |
| if (res.contains("errorCode")) { |
| String err = String.format("ucs call failed:\nsubmitted doc:%s\nresponse:%s\n", xml, res); |
| throw new CloudRuntimeException(err); |
| } |
| return res; |
| } catch (Exception e) { |
| throw new CloudRuntimeException(e.getMessage(), e); |
| } finally { |
| post.releaseConnection(); |
| } |
| } |
| } |