Skip to content

Commit 920c7eb

Browse files
committed
feat: Add PowerOn action for server
1 parent b07587b commit 920c7eb

File tree

6 files changed

+73
-12
lines changed

6 files changed

+73
-12
lines changed

src/main/java/dev/tomr/hcloud/listener/ServerChangeListener.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,15 @@ public void propertyChange(PropertyChangeEvent evt) {
3535
logger.warn("This is a potentially destructive action!");
3636
HetznerCloud.getInstance().getServiceManager().getServerService().powerOffServer(server);
3737
}
38+
case "poweron" -> {
39+
logger.info("Server power on has been called. Instructing Hetzner to power up the server");
40+
HetznerCloud.getInstance().getServiceManager().getServerService().powerOnServer(server);
41+
}
3842
default -> {
3943
logger.info("Server changed: {}", evt.getPropertyName());
4044
logger.info("Server: {} -> {}", evt.getOldValue(), evt.getNewValue());
4145
HetznerCloud.getInstance().getServiceManager().getServerService().serverNameOrLabelUpdate(evt.getPropertyName(), evt.getNewValue(), server);
4246
}
4347
}
44-
// if (evt.getPropertyName().equals("delete")) {
45-
//
46-
// } else if (evt.getPropertyName().equals("shutdown")) {
47-
//
48-
// } else if (evt.getPropertyName().equals("poweroff")) {
49-
//
50-
// } else {
51-
//
52-
// }
5348
}
5449
}

src/main/java/dev/tomr/hcloud/resources/server/Server.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@ public void powerOff() {
120120
propertyChangeSupport.firePropertyChange("poweroff", null, null);
121121
}
122122

123+
/**
124+
* Starts the Server by turning it's power on
125+
*/
126+
public void powerOn() {
127+
propertyChangeSupport.firePropertyChange("poweron", null, null);
128+
}
129+
123130

124131
// These are the current setters that will send an API request (PUT /servers) when actions begin to be added, they will also likely be triggered by setters
125132

src/main/java/dev/tomr/hcloud/service/action/Action.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
public enum Action {
44
SHUTDOWN("shutdown"),
5-
POWEROFF("poweroff");
5+
POWEROFF("poweroff"),
6+
POWERON("poweron");
67

78
public final String path;
89

src/main/java/dev/tomr/hcloud/service/server/ServerService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
import java.util.concurrent.atomic.AtomicReference;
2626

2727
import static dev.tomr.hcloud.http.RequestVerb.*;
28-
import static dev.tomr.hcloud.service.action.Action.POWEROFF;
29-
import static dev.tomr.hcloud.service.action.Action.SHUTDOWN;
28+
import static dev.tomr.hcloud.service.action.Action.*;
3029

3130
public class ServerService {
3231
protected static final Logger logger = LogManager.getLogger();
@@ -136,6 +135,10 @@ public void powerOffServer(Server server) {
136135
sendServerAction(server, POWEROFF);
137136
}
138137

138+
public void powerOnServer(Server server) {
139+
sendServerAction(server, POWERON);
140+
}
141+
139142
private void sendServerAction(Server server, dev.tomr.hcloud.service.action.Action givenAction) {
140143
List<String> hostAndKey = HetznerCloud.getInstance().getHttpDetails();
141144
String httpUrl = String.format("%sservers/%d/actions/%s", hostAndKey.get(0), server.getId(), givenAction.path);

src/test/java/dev/tomr/hcloud/resources/server/ServerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,5 +274,29 @@ void callingPoweroffSendsAnEventToTheServerChangeListener() {
274274

275275
}
276276

277+
@Test
278+
@DisplayName("calling poweron sends an event to the ServerChangeListener")
279+
void callingPowerOnSendsAnEventToTheServerChangeListener() {
280+
try (MockedStatic<HetznerCloud> hetznerCloud = mockStatic(HetznerCloud.class)) {
281+
HetznerCloud hetznerCloudMock = mock(HetznerCloud.class);
282+
ServerChangeListener scl = new ServerChangeListener();
283+
ServerChangeListener serverChangeListener = spy(scl);
284+
ListenerManager listenerManager = mock(ListenerManager.class);
285+
ServiceManager serviceManager = mock(ServiceManager.class);
286+
ServerService serverService = mock(ServerService.class);
287+
ArgumentCaptor<PropertyChangeEvent> captor = ArgumentCaptor.forClass(PropertyChangeEvent.class);
288+
289+
hetznerCloud.when(HetznerCloud::getInstance).thenReturn(hetznerCloudMock);
290+
when(hetznerCloudMock.getListenerManager()).thenReturn(listenerManager);
291+
when(hetznerCloudMock.getServiceManager()).thenReturn(serviceManager);
292+
when(listenerManager.getServerChangeListener()).thenReturn(serverChangeListener);
293+
when(serviceManager.getServerService()).thenReturn(serverService);
277294

295+
Server server = new Server();
296+
server.powerOn();
297+
verify(serverChangeListener, times(1)).propertyChange(captor.capture());
298+
assertEquals("poweron", captor.getValue().getPropertyName());
299+
}
300+
301+
}
278302
}

src/test/java/dev/tomr/hcloud/service/server/ServerServiceTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,4 +790,35 @@ void powerOffServerCallsHetznerAndTracksTheAction() throws IOException, Interrup
790790
}
791791
}
792792

793+
@Test
794+
@DisplayName("PowerOn Server calls Hetzner and tracks the action")
795+
void powerOnServerCallsHetznerAndTracksTheAction() throws IOException, InterruptedException, IllegalAccessException {
796+
HetznerCloud hetznerCloud = mock(HetznerCloud.class);
797+
HetznerCloudHttpClient hetznerCloudHttpClient = mock(HetznerCloudHttpClient.class);
798+
ListenerManager listenerManager = mock(ListenerManager.class);
799+
ServiceManager serviceManager = mock(ServiceManager.class);
800+
ActionService actionService = mock(ActionService.class);
801+
802+
try (MockedStatic<HetznerCloud> hetznerCloudMockedStatic = mockStatic(HetznerCloud.class);
803+
MockedStatic<HetznerCloudHttpClient> hetznerCloudHttpClientMockedStatic = mockStatic(HetznerCloudHttpClient.class)) {
804+
805+
Action action = new Action();
806+
action.setFinished(Date.from(Instant.now()).toString());
807+
808+
hetznerCloudHttpClientMockedStatic.when(HetznerCloudHttpClient::getInstance).thenReturn(hetznerCloudHttpClient);
809+
hetznerCloudMockedStatic.when(HetznerCloud::getInstance).thenReturn(hetznerCloud);
810+
when(hetznerCloud.getListenerManager()).thenReturn(listenerManager);
811+
when(hetznerCloud.getHttpDetails()).thenReturn(List.of("http://host/", "key1234"));
812+
when(serviceManager.getActionService()).thenReturn(actionService);
813+
when(actionService.waitForActionToComplete(any(Action.class))).thenReturn(CompletableFuture.completedFuture(action));
814+
815+
when(hetznerCloudHttpClient.sendHttpRequest(any(), anyString(), any(RequestVerb.class), anyString(), anyString())).thenReturn(new ActionWrapper(action));
816+
817+
ServerService serverService = new ServerService(serviceManager);
818+
serverService.powerOnServer(new Server());
819+
820+
verify(hetznerCloudHttpClient, times(1)).sendHttpRequest(any(), anyString(), eq(RequestVerb.POST), eq("key1234"), eq(""));
821+
verify(actionService, times(1)).waitForActionToComplete(any(Action.class));
822+
}
823+
}
793824
}

0 commit comments

Comments
 (0)