From c307d853712a7f270a2761b351bbc97a54723d16 Mon Sep 17 00:00:00 2001 From: Abid Mehmood Date: Thu, 13 Apr 2017 22:37:20 +0200 Subject: [PATCH] Refactored some code and added module name information to Call classes --- .../suse/salt/netapi/calls/AbstractCall.java | 54 +++++++++++++++++++ .../com/suse/salt/netapi/calls/LocalCall.java | 25 ++++----- .../suse/salt/netapi/calls/RunnerCall.java | 13 ++--- .../com/suse/salt/netapi/calls/WheelCall.java | 12 ++--- .../suse/salt/netapi/utils/ClientUtils.java | 15 ++++++ .../suse/salt/netapi/calls/LocalCallTest.java | 23 +++++++- .../salt/netapi/utils/ClientUtilsTest.java | 13 +++++ 7 files changed, 119 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/suse/salt/netapi/calls/AbstractCall.java diff --git a/src/main/java/com/suse/salt/netapi/calls/AbstractCall.java b/src/main/java/com/suse/salt/netapi/calls/AbstractCall.java new file mode 100644 index 000000000..61bcc25e0 --- /dev/null +++ b/src/main/java/com/suse/salt/netapi/calls/AbstractCall.java @@ -0,0 +1,54 @@ +package com.suse.salt.netapi.calls; + +import com.google.gson.reflect.TypeToken; +import com.suse.salt.netapi.utils.ClientUtils; + +/** + * Abstract class for all function calls in salt. + * + * @param the return type of the called function + */ +public abstract class AbstractCall implements Call { + + private final String moduleName; + private final String functionName; + private final TypeToken returnType; + + AbstractCall(String functionName, TypeToken returnType) { + this.moduleName = ClientUtils.getModuleNameFromFunction(functionName); + this.functionName = functionName; + this.returnType = returnType; + } + + AbstractCall(String moduleName, String functionName, TypeToken returnType) { + this.moduleName = moduleName; + this.functionName = functionName; + this.returnType = returnType; + } + + /** + * Returns the module name + */ + public String getModuleName() + { + return moduleName; + } + + /** + * Return the function name + * @return functionName + */ + String getFunctionName() { + return functionName; + } + + /** + * Reurn the type + * @return returnType + */ + public TypeToken getReturnType() { + return returnType; + } + + +} diff --git a/src/main/java/com/suse/salt/netapi/calls/LocalCall.java b/src/main/java/com/suse/salt/netapi/calls/LocalCall.java index 0588666b2..13717853f 100644 --- a/src/main/java/com/suse/salt/netapi/calls/LocalCall.java +++ b/src/main/java/com/suse/salt/netapi/calls/LocalCall.java @@ -38,12 +38,10 @@ * * @param the return type of the called function */ -public class LocalCall implements Call { +public class LocalCall extends AbstractCall { - private final String functionName; private final Optional> arg; private final Optional> kwarg; - private final TypeToken returnType; private final Optional metadata; private final Optional timeout; private final Optional gatherJobTimeout; @@ -52,10 +50,9 @@ public LocalCall(String functionName, Optional> arg, Optional> kwarg, TypeToken returnType, Optional metadata, Optional timeout, Optional gatherJobTimeout) { - this.functionName = functionName; + super(functionName, returnType); this.arg = arg; this.kwarg = kwarg; - this.returnType = returnType; this.metadata = metadata; this.timeout = timeout; this.gatherJobTimeout = gatherJobTimeout; @@ -81,37 +78,33 @@ public LocalCall(String functionName, Optional> arg, } public LocalCall withMetadata(Object metadata) { - return new LocalCall<>(functionName, arg, kwarg, returnType, Optional.of(metadata), - timeout, gatherJobTimeout); + return new LocalCall<>(getFunctionName(), arg, kwarg, getReturnType(), + Optional.of(metadata), timeout, gatherJobTimeout); } public LocalCall withoutMetadata() { - return new LocalCall<>(functionName, arg, kwarg, returnType, Optional.empty(), - timeout, gatherJobTimeout); + return new LocalCall<>(getFunctionName(), arg, kwarg, getReturnType(), + Optional.empty(), timeout, gatherJobTimeout); } public LocalCall withTimeouts(Optional timeout, Optional gatherJobTimeout) { - return new LocalCall<>(functionName, arg, kwarg, returnType, metadata, + return new LocalCall<>(getFunctionName(), arg, kwarg, getReturnType(), metadata, timeout, gatherJobTimeout); } public LocalCall withoutTimeouts() { - return new LocalCall<>(functionName, arg, kwarg, returnType, metadata, + return new LocalCall<>(getFunctionName(), arg, kwarg, getReturnType(), metadata, Optional.empty(), Optional.empty()); } - public TypeToken getReturnType() { - return returnType; - } - /** * {@inheritDoc} */ @Override public Map getPayload() { HashMap payload = new HashMap<>(); - payload.put("fun", functionName); + payload.put("fun", getFunctionName()); arg.ifPresent(arg -> payload.put("arg", arg)); kwarg.ifPresent(kwarg -> payload.put("kwarg", kwarg)); metadata.ifPresent(m -> payload.put("metadata", m)); diff --git a/src/main/java/com/suse/salt/netapi/calls/RunnerCall.java b/src/main/java/com/suse/salt/netapi/calls/RunnerCall.java index bc76a34ed..1d8b6e693 100644 --- a/src/main/java/com/suse/salt/netapi/calls/RunnerCall.java +++ b/src/main/java/com/suse/salt/netapi/calls/RunnerCall.java @@ -20,21 +20,14 @@ * * @param the return type of the called function */ -public class RunnerCall implements Call { +public class RunnerCall extends AbstractCall { - private final String functionName; private final Optional> kwargs; - private final TypeToken returnType; public RunnerCall(String functionName, Optional> kwargs, TypeToken returnType) { - this.functionName = functionName; + super(functionName, returnType); this.kwargs = kwargs; - this.returnType = returnType; - } - - public TypeToken getReturnType() { - return returnType; } /** @@ -43,7 +36,7 @@ public TypeToken getReturnType() { @Override public Map getPayload() { HashMap payload = new HashMap<>(); - payload.put("fun", functionName); + payload.put("fun", getFunctionName()); kwargs.ifPresent(kwargs -> payload.put("kwargs", kwargs)); return payload; } diff --git a/src/main/java/com/suse/salt/netapi/calls/WheelCall.java b/src/main/java/com/suse/salt/netapi/calls/WheelCall.java index a78e0b113..e722728f9 100644 --- a/src/main/java/com/suse/salt/netapi/calls/WheelCall.java +++ b/src/main/java/com/suse/salt/netapi/calls/WheelCall.java @@ -20,21 +20,15 @@ * * @param the return type of the called function */ -public class WheelCall implements Call { +public class WheelCall extends AbstractCall { - private final String functionName; private final Optional> kwargs; - private final TypeToken returnType; public WheelCall(String functionName, Optional> kwargs, TypeToken returnType) { - this.functionName = functionName; + super(functionName, returnType); this.kwargs = kwargs; - this.returnType = returnType; - } - public TypeToken getReturnType() { - return returnType; } /** @@ -43,7 +37,7 @@ public TypeToken getReturnType() { @Override public Map getPayload() { HashMap payload = new HashMap<>(); - payload.put("fun", functionName); + payload.put("fun", getFunctionName()); kwargs.ifPresent(payload::putAll); return payload; } diff --git a/src/main/java/com/suse/salt/netapi/utils/ClientUtils.java b/src/main/java/com/suse/salt/netapi/utils/ClientUtils.java index ffd0e901f..d3684a90c 100644 --- a/src/main/java/com/suse/salt/netapi/utils/ClientUtils.java +++ b/src/main/java/com/suse/salt/netapi/utils/ClientUtils.java @@ -67,4 +67,19 @@ public static ParameterizedType parameterizedType(Type ownerType, Type rawType, Type... typeArguments) { return newParameterizedTypeWithOwner(ownerType, rawType, typeArguments); } + + /** + * Get the name from function name e.g in case of 'state.high', this function will + * return 'state'. + * @param functionName + * @return module name + * @throws IllegalArgumentException + */ + public static String getModuleNameFromFunction(final String functionName) + throws IllegalArgumentException { + if (!functionName.contains(".")) { + throw new IllegalArgumentException(functionName); + } + return functionName.split("\\.")[0]; + } } diff --git a/src/test/java/com/suse/salt/netapi/calls/LocalCallTest.java b/src/test/java/com/suse/salt/netapi/calls/LocalCallTest.java index 2359c7d8d..de6346ae9 100644 --- a/src/test/java/com/suse/salt/netapi/calls/LocalCallTest.java +++ b/src/test/java/com/suse/salt/netapi/calls/LocalCallTest.java @@ -23,8 +23,8 @@ import com.suse.salt.netapi.datatypes.target.Target; import com.suse.salt.netapi.exception.SaltException; import com.suse.salt.netapi.utils.ClientUtils; - import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.google.gson.reflect.TypeToken; import org.junit.Before; import org.junit.Rule; @@ -105,6 +105,27 @@ public void testWithTimeouts() { assertEquals(runWithTimeouts.getPayload().get("timeout"), 4); assertEquals(runWithTimeouts.getPayload().get("gather_job_timeout"), 1); } + /** + * Verify that system return the correct module name + */ + + @Test + public void testModuleName() { + LocalCall run = Cmd.run("echo 'hello world'"); + assertEquals(run.getModuleName(), "cmd"); + + } + + /** + * Verify that system throw IllegalArgumentException when function name is not in right + * format. + */ + @Test(expected = IllegalArgumentException.class) + public void testFunctionName() { + LocalCall run = new LocalCall<>("cmdrun", Optional.empty(), + Optional.empty(), new TypeToken(){}); + System.out.println(run.getModuleName()); + } /** * Verify correctness of the request body with an exemplary synchronous call. diff --git a/src/test/java/com/suse/salt/netapi/utils/ClientUtilsTest.java b/src/test/java/com/suse/salt/netapi/utils/ClientUtilsTest.java index 7be9454f8..166fe0c85 100644 --- a/src/test/java/com/suse/salt/netapi/utils/ClientUtilsTest.java +++ b/src/test/java/com/suse/salt/netapi/utils/ClientUtilsTest.java @@ -64,4 +64,17 @@ public void testStreamToString() { assertEquals("Result doesn't match test string", TEST_STRING, result); } + @Test + public void testGetModuleNameFromRightFunction() { + final String TEST_STRING = "state.high"; + String result = ClientUtils.getModuleNameFromFunction(TEST_STRING); + assertEquals("Result doesn't match test string", result, "state"); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetModuleNameFromWrongFunction() { + final String TEST_STRING = "statehigh"; + ClientUtils.getModuleNameFromFunction(TEST_STRING); + } + }