Bind daemon to Pacemaker resource identity
This commit is contained in:
Executable
+171
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, "daemon")
|
||||
|
||||
import server
|
||||
from registry import RegistryError
|
||||
|
||||
|
||||
class FakeRegistry:
|
||||
def __init__(self):
|
||||
self.resources = {
|
||||
"postgresql-ha": object(),
|
||||
}
|
||||
self.executions = []
|
||||
|
||||
def list_resources(self):
|
||||
return {
|
||||
"postgresql-ha": {
|
||||
"resource": "postgresql-ha",
|
||||
}
|
||||
}
|
||||
|
||||
def execute(self, resource, action):
|
||||
self.executions.append(
|
||||
(resource, action)
|
||||
)
|
||||
|
||||
return {
|
||||
"ok": True,
|
||||
"resource": resource,
|
||||
"plugin": "postgresql",
|
||||
"action": action,
|
||||
"result": {
|
||||
"accepted": True,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def require(condition, message):
|
||||
if not condition:
|
||||
raise SystemExit("FAIL: " + message)
|
||||
|
||||
|
||||
def require_registry_error(callback, message):
|
||||
try:
|
||||
callback()
|
||||
|
||||
except RegistryError:
|
||||
return
|
||||
|
||||
raise SystemExit("FAIL: " + message)
|
||||
|
||||
|
||||
registry = FakeRegistry()
|
||||
|
||||
print("===== PACEMAKER RESOURCE BINDING =====")
|
||||
|
||||
require_registry_error(
|
||||
lambda: server.load_pacemaker_resource_binding(
|
||||
registry,
|
||||
{},
|
||||
),
|
||||
"missing binding was accepted",
|
||||
)
|
||||
|
||||
print("missing_binding rejected")
|
||||
|
||||
require_registry_error(
|
||||
lambda: server.load_pacemaker_resource_binding(
|
||||
registry,
|
||||
{
|
||||
"PACEMAKER_RESOURCE_ID": "other-resource",
|
||||
},
|
||||
),
|
||||
"unknown binding was accepted",
|
||||
)
|
||||
|
||||
print("unknown_binding rejected")
|
||||
|
||||
binding = server.load_pacemaker_resource_binding(
|
||||
registry,
|
||||
{
|
||||
"PACEMAKER_RESOURCE_ID": "postgresql-ha",
|
||||
},
|
||||
)
|
||||
|
||||
require(
|
||||
binding == "postgresql-ha",
|
||||
"valid binding was not loaded",
|
||||
)
|
||||
|
||||
print("valid_binding accepted")
|
||||
|
||||
server.registry = registry
|
||||
server.pacemaker_resource_id = binding
|
||||
|
||||
ping = server.handle_request({
|
||||
"protocol_version": 1,
|
||||
"action": "ping",
|
||||
})
|
||||
|
||||
require(ping["ok"] is True, "ping failed")
|
||||
require(
|
||||
ping["pacemaker_resource"] == "postgresql-ha",
|
||||
"ping did not report the binding",
|
||||
)
|
||||
require(
|
||||
ping["protocol_version"] == 1,
|
||||
"ping lost the protocol version",
|
||||
)
|
||||
|
||||
print("ping_binding reported")
|
||||
|
||||
response = server.handle_request({
|
||||
"protocol_version": 1,
|
||||
"resource": "postgresql-ha",
|
||||
"action": "monitor",
|
||||
})
|
||||
|
||||
require(
|
||||
response["ok"] is True,
|
||||
"matching resource was rejected",
|
||||
)
|
||||
require(
|
||||
registry.executions
|
||||
== [("postgresql-ha", "monitor")],
|
||||
"matching request was not executed exactly once",
|
||||
)
|
||||
|
||||
print("matching_resource executed")
|
||||
|
||||
response = server.handle_request({
|
||||
"protocol_version": 1,
|
||||
"resource": "different-resource",
|
||||
"action": "monitor",
|
||||
})
|
||||
|
||||
require(
|
||||
response["ok"] is False,
|
||||
"mismatched resource was accepted",
|
||||
)
|
||||
require(
|
||||
response["error_code"]
|
||||
== "resource_binding_mismatch",
|
||||
"wrong mismatch classification",
|
||||
)
|
||||
require(
|
||||
response["resource"]
|
||||
== "different-resource",
|
||||
"rejected resource was not echoed",
|
||||
)
|
||||
require(
|
||||
response["action"] == "monitor",
|
||||
"rejected action was not echoed",
|
||||
)
|
||||
require(
|
||||
registry.executions
|
||||
== [("postgresql-ha", "monitor")],
|
||||
"mismatched request reached the registry",
|
||||
)
|
||||
require(
|
||||
response["protocol_version"] == 1,
|
||||
"mismatch response lost protocol metadata",
|
||||
)
|
||||
|
||||
print("mismatched_resource rejected")
|
||||
|
||||
print()
|
||||
print("RESOURCE_BINDING_TEST_PASS=1")
|
||||
Reference in New Issue
Block a user