require("../utils.js")() var server = { data: { id: "test-server", type: "servers", attributes: { parameters: { port: 3003, address: "127.0.0.1", protocol: "MariaDBBackend" } } } }; var rel = { services: { data: [ { id: "RW-Split-Router", type: "services" }, { id: "Read-Connection-Router", type: "services" }, ] } }; describe("Server", function() { before(startMaxScale) it("rejects new server with only `port`", function() { delete server.data.attributes.parameters.address return request.post(base_url + "/servers/", {json: server }) .should.be.rejected }); it("rejects new server with both `address` and `socket`", function() { server.data.attributes.parameters.address = '127.0.0.1' server.data.attributes.parameters.socket = '/tmp/mysql.sock' return request.post(base_url + "/servers/", {json: server }) .should.be.rejected }); it("rejects new server with neither `address` nor `socket`", function() { delete server.data.attributes.parameters.address delete server.data.attributes.parameters.socket return request.post(base_url + "/servers/", {json: server }) .should.be.rejected }); it("create new server", function() { server.data.attributes.parameters.address = '127.0.0.1' server.data.attributes.parameters.port = 3000 return request.post(base_url + "/servers/", {json: server }) .should.be.fulfilled }); it("request server", function() { return request.get(base_url + "/servers/" + server.data.id) .should.be.fulfilled }); it("update server", function() { server.data.attributes.parameters.weight = 10 return request.patch(base_url + "/servers/" + server.data.id, { json: server}) .should.be.fulfilled }); it("rejects invalid `address`", function() { server.data.attributes.parameters.address = '/tmp/mysql.sock' return request.patch(base_url + "/servers/" + server.data.id, { json: server}) .should.be.rejected }); it("rejects invalid `port`", function() { server.data.attributes.parameters.address = '127.0.0.1' server.data.attributes.parameters.port = '/tmp/server.sock' return request.patch(base_url + "/servers/" + server.data.id, { json: server}) .should.be.rejected }); it("rejects `address` and `socket` in PATCH", function() { server.data.attributes.parameters.address = '127.0.0.1' server.data.attributes.parameters.socket = '/tmp/mysql.sock' return request.patch(base_url + "/servers/" + server.data.id, { json: server}) .should.be.rejected }); it("alters `address` to `socket` in PATCH", function() { delete server.data.attributes.parameters.address delete server.data.attributes.parameters.port server.data.attributes.parameters.socket = '/tmp/mysql.sock' return request.patch(base_url + "/servers/" + server.data.id, { json: server}) .should.be.fulfilled }); it("destroy server", function() { return request.delete(base_url + "/servers/" + server.data.id) .should.be.fulfilled }); after(stopMaxScale) }); describe("Server Relationships", function() { before(startMaxScale) // We need a deep copy of the original server var rel_server = JSON.parse(JSON.stringify(server)) rel_server.data.relationships = rel it("create new server with relationships", function() { return request.post(base_url + "/servers/", {json: rel_server}) .should.be.fulfilled }); it("request server", function() { return request.get(base_url + "/servers/" + rel_server.data.id, { json: true }) .then((res) => { res.data.relationships.services.data.should.have.lengthOf(2) }) }); it("add relationships with `relationships` endpoint", function() { return request.patch(base_url + "/servers/" + rel_server.data.id + "/relationships/monitors", { json: { data: [ { "id": "MariaDB-Monitor", "type": "monitors" }]}}) .then(() => request.get(base_url + "/servers/" + rel_server.data.id, {json: true})) .then((res) => { res.data.relationships.monitors.data.should.have.lengthOf(1) .that.has.deep.include({ "id": "MariaDB-Monitor", "type": "monitors" }) }) }); it("bad request body with `relationships` endpoint should be rejected", function() { var body = {monitors: null} return request.patch(base_url + "/servers/" + rel_server.data.id + "/relationships/monitors", { json: body }) .should.be.rejected }); it("remove relationships with `relationships` endpoint", function() { var body = {data: null} return request.patch(base_url + "/servers/" + rel_server.data.id + "/relationships/monitors", { json: body }) .then(() => request.get(base_url + "/servers/" + rel_server.data.id, {json: true})) .then((res) => { // Only monitor relationship should be undefined res.data.relationships.should.not.have.keys("monitors") res.data.relationships.should.have.keys("services") }) }); it("remove with malformed relationships", function() { rel_server.data.relationships["services"] = null rel_server.data.relationships["monitors"] = null return request.patch(base_url + "/servers/" + rel_server.data.id, {json: rel_server}) .should.be.rejected .then(() => request.get(base_url + "/servers/" + rel_server.data.id, {json: true})) .then((res) => { res.data.relationships.should.have.keys("services") }) }); it("missing relationships are not removed", function() { rel_server.data.relationships = {} return request.patch(base_url + "/servers/" + rel_server.data.id, {json: rel_server}) .should.be.fulfilled .then(() => request.get(base_url + "/servers/" + rel_server.data.id, {json: true})) .then((res) => { res.data.relationships.should.have.keys("services") }) }); it("remove relationships", function() { rel_server.data.relationships["services"] = {data: null} rel_server.data.relationships["monitors"] = {data: null} return request.patch(base_url + "/servers/" + rel_server.data.id, {json: rel_server}) .should.be.fulfilled .then(() => request.get(base_url + "/servers/" + rel_server.data.id, {json: true})) .then((res) => { res.data.relationships.should.not.have.keys("services") res.data.relationships.should.not.have.keys("monitors") }) }); it("destroy server", function() { return request.delete(base_url + "/servers/" + rel_server.data.id) .should.be.fulfilled }); after(stopMaxScale) }); describe("Server State", function() { before(startMaxScale) it("create new server", function() { return request.post(base_url + "/servers/", {json: server }) .should.be.fulfilled }); it("set server into maintenance", function() { return request.put(base_url + "/servers/" + server.data.id + "/set?state=maintenance") .then(function(resp) { return request.get(base_url + "/servers/" + server.data.id) }) .then(function(resp) { var srv = JSON.parse(resp) srv.data.attributes.state.should.match(/Maintenance/) }) }); it("force server into maintenance", function() { return request.put(base_url + "/servers/" + server.data.id + "/set?state=maintenance&force=yes") .then(function(resp) { return request.get(base_url + "/servers/" + server.data.id) }) .then(function(resp) { var srv = JSON.parse(resp) srv.data.attributes.state.should.match(/Maintenance/) srv.data.attributes.statistics.connections.should.be.equal(0) }) }); it("clear maintenance", function() { return request.put(base_url + "/servers/" + server.data.id + "/clear?state=maintenance") .then(function(resp) { return request.get(base_url + "/servers/" + server.data.id) }) .then(function(resp) { var srv = JSON.parse(resp) srv.data.attributes.state.should.not.match(/Maintenance/) }) }); it("set invalid state value", function() { return request.put(base_url + "/servers/" + server.data.id + "/set?state=somethingstrange") .should.be.rejected }); it("clear invalid state value", function() { return request.put(base_url + "/servers/" + server.data.id + "/clear?state=somethingstrange") .should.be.rejected }); it("destroy server", function() { return request.delete(base_url + "/servers/" + server.data.id) .should.be.fulfilled }); after(stopMaxScale) });