package org.jenkinsci.plugins.jenkernetes.workflowsteps; import com.google.common.net.HttpHeaders; import com.google.gson.Gson; import com.google.gson.JsonIOException; import com.google.gson.JsonSyntaxException; import groovy.json.JsonBuilder; import groovy.json.JsonSlurper; import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collection; import javax.net.ssl.SSLContext; /** * TODO: Insert description here. (generated by elibixby) */ public class KubernetesClient { private static final class BearerToken { public String BearerToken; @SuppressWarnings("unused") public boolean Insecure; } private static final String BEARER_TOKEN_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/token"; private static final CloseableHttpClient CLIENT; private static final HttpHost HOST; static { SSLContextBuilder builder = SSLContexts.custom(); try { builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } SSLContext sslContext = null; try { sslContext = builder.build(); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Collection<BasicHeader> headers = new ArrayList<BasicHeader>(); headers.add(new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json")); String bearerToken = null; try { bearerToken = (new Gson()).fromJson(new FileReader(new File(BEARER_TOKEN_PATH)), BearerToken.class).BearerToken; } catch (JsonSyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonIOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } headers.add(new BasicHeader(HttpHeaders.AUTHORIZATION, "Bearer " + bearerToken)); CLIENT = HttpClients.custom() .setDefaultHeaders(headers) .setSSLSocketFactory(sslsf).build(); InetAddress kubernetesAddr = null; try { kubernetesAddr = InetAddress.getByName("kubernetes"); } catch (UnknownHostException e) { e.printStackTrace(); } HOST = new HttpHost(kubernetesAddr, 443, "https"); } //version string //TODO Add namespace support private static final String PREFIX = "/api/v1/namespaces/default/"; private static Object parse(CloseableHttpResponse resp) throws IOException{ try{ return (new JsonSlurper()).parse((new InputStreamReader(resp.getEntity().getContent()))); } finally{ resp.close(); } } private static StringEntity toEntity(Object payload) throws UnsupportedEncodingException{ return new StringEntity(new JsonBuilder(payload).toString()); } private static <T extends HttpRequestBase> CloseableHttpResponse makeCall(T request) throws ClientProtocolException, IOException { return CLIENT.execute(HOST, request); } public static Object get(String path) throws ClientProtocolException, IOException { return parse(makeCall(new HttpGet(PREFIX.concat(path)))); } public static Object delete(String path) throws ClientProtocolException, IOException{ return parse(makeCall(new HttpDelete(PREFIX.concat(path)))); } public static Object create(String path, Object payload) throws ClientProtocolException, IOException{ HttpPost post = new HttpPost(PREFIX.concat(path)); post.setEntity(toEntity(payload)); return parse(makeCall(post)); } public static Object update(String path, Object payload) throws ClientProtocolException, IOException{ HttpPut put = new HttpPut(PREFIX.concat(path)); put.setEntity(toEntity(payload)); return parse(makeCall(put)); } }