aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/zone/v2/ZoneApiTest.java
blob: 782dc6dba4fc82fafaa70f2f515e36db3f4ef148 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.yahoo.vespa.hosted.controller.restapi.zone.v2;

import com.yahoo.application.container.handler.Request;
import com.yahoo.application.container.handler.Request.Method;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.RegionName;
import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.hosted.controller.ConfigServerProxyMock;
import com.yahoo.vespa.hosted.controller.ZoneRegistryMock;
import com.yahoo.vespa.hosted.controller.restapi.ContainerControllerTester;
import com.yahoo.vespa.hosted.controller.restapi.ControllerContainerTest;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

/**
 * @author mpolden
 */
public class ZoneApiTest extends ControllerContainerTest {

    private static final String responseFiles = "src/test/java/com/yahoo/vespa/hosted/controller/restapi/zone/v2/responses/";
    private static final List<ZoneId> zones = Arrays.asList(
            ZoneId.from(Environment.prod, RegionName.from("us-north-1")),
            ZoneId.from(Environment.dev, RegionName.from("us-north-2")),
            ZoneId.from(Environment.test, RegionName.from("us-north-3")),
            ZoneId.from(Environment.staging, RegionName.from("us-north-4"))
                                                           );

    private ContainerControllerTester tester;
    private ConfigServerProxyMock proxy;

    @Before
    public void before() {
        ZoneRegistryMock zoneRegistry = (ZoneRegistryMock) container.components()
                                                                    .getComponent(ZoneRegistryMock.class.getName());
        zoneRegistry.setDefaultRegionForEnvironment(Environment.dev, RegionName.from("us-north-2"))
                    .setZones(zones);
        this.tester = new ContainerControllerTester(container, responseFiles);
        this.proxy = (ConfigServerProxyMock) container.components().getComponent(ConfigServerProxyMock.class.getName());
    }

    @Test
    public void test_requests() throws Exception {
        // GET /zone/v2
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2"),
                                                new File("root.json"));

        // GET /zone/v2/prod/us-north-1
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-1"),
                                                "ok");
        assertEquals("prod", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-1", proxy.lastReceived().get().getRegion());
        assertEquals("", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("GET", proxy.lastReceived().get().getMethod());

        // GET /zone/v2/nodes/v2/node/?recursive=true
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/node/?recursive=true"),
                                                "ok");

        assertEquals("prod", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-1", proxy.lastReceived().get().getRegion());
        assertEquals("/nodes/v2/node/?recursive=true", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("GET", proxy.lastReceived().get().getMethod());

        // POST /zone/v2/dev/us-north-2/nodes/v2/command/restart?hostname=node1
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/dev/us-north-2/nodes/v2/command/restart?hostname=node1",
                                                            new byte[0], Method.POST),
                                                "ok");
        assertEquals("dev", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-2", proxy.lastReceived().get().getRegion());
        assertEquals("/nodes/v2/command/restart?hostname=node1", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("POST", proxy.lastReceived().get().getMethod());

        // PUT /zone/v2/prod/us-north-1/nodes/v2/state/dirty/node1
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/state/dirty/node1",
                                                            new byte[0], Method.PUT), "ok");
        assertEquals("prod", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-1", proxy.lastReceived().get().getRegion());
        assertEquals("/nodes/v2/state/dirty/node1", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("PUT", proxy.lastReceived().get().getMethod());

        // DELETE /zone/v2/prod/us-north-1/nodes/v2/node/node1
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/node/node1",
                                                            new byte[0], Method.DELETE), "ok");
        assertEquals("prod", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-1", proxy.lastReceived().get().getRegion());
        assertEquals("/nodes/v2/node/node1", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("DELETE", proxy.lastReceived().get().getMethod());

        // PATCH /zone/v2/prod/us-north-1/nodes/v2/node/node1
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/node/node1",
                                                            Utf8.toBytes("{\"currentRestartGeneration\": 1}"),
                                                            Method.PATCH), "ok");
        assertEquals("prod", proxy.lastReceived().get().getEnvironment());
        assertEquals("us-north-1", proxy.lastReceived().get().getRegion());
        assertEquals("/nodes/v2/node/node1", proxy.lastReceived().get().getConfigServerRequest());
        assertEquals("PATCH", proxy.lastReceived().get().getMethod());
        assertEquals("{\"currentRestartGeneration\": 1}", proxy.lastRequestBody().get());
    }

    @Test
    public void test_invalid_requests() throws Exception {
        // GET /zone/v2/prod/us-north-34/nodes/v2
        tester.containerTester().assertResponse(new Request("http://localhost:8080/zone/v2/prod/us-north-42/nodes/v2",
                                                            new byte[0], Method.POST),
                                                new File("unknown-zone.json"), 400);
        assertFalse(proxy.lastReceived().isPresent());
    }

}