Skip to content

Commit 8e4adf4

Browse files
committed
Add expiry policy on queue
This should delete the queue after it's unused for over 1 Minute.
1 parent 1109dfc commit 8e4adf4

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

integration/test/Testlib/Run.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,17 @@ deleteFederationQueues testDomains opts username password = do
171171
page <- client.listQueuesByVHost opts.vHost (fromString $ "^backend-notifications\\." <> domain <> "$") True 100 1
172172
for_ page.items $ \queue -> do
173173
putStrLn $ "Deleting queue " <> T.unpack queue.name
174-
void $ deleteQueue client opts.vHost queue.name
174+
void $
175+
addPolicy
176+
client
177+
opts.vHost
178+
(T.pack "expiry")
179+
( RabbitMQPolicy
180+
{ polPattern = (fromString $ "^backend-notifications\\." <> domain <> "$"),
181+
polApplyTo = Queues,
182+
polDefinition = RabbitMQPolicyDefinition {expires = Just 60000}
183+
}
184+
)
175185

176186
doListTests :: [(String, String, String, x)] -> IO ()
177187
doListTests tests = for_ tests $ \(qname, _desc, _full, _) -> do

libs/extended/src/Network/RabbitMqAdmin.hs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,56 @@ instance (ToJSON a) => ToJSON (Page a) where
3030
{ fieldLabelModifier = camelTo2 '_'
3131
}
3232

33+
-- | Target(s) of a `RabbitMQPolicy`
34+
--
35+
-- This type is incomplete. Add more constructors when needed.
36+
data RabbitMQPolicyTarget = Queues
37+
deriving (Show, Generic)
38+
39+
instance FromJSON RabbitMQPolicyTarget
40+
41+
instance ToJSON RabbitMQPolicyTarget
42+
43+
data RabbitMQPolicyDefinition = RabbitMQPolicyDefinition
44+
{ expires :: Maybe Word
45+
}
46+
deriving (Show, Generic)
47+
48+
instance FromJSON RabbitMQPolicyDefinition
49+
50+
instance ToJSON RabbitMQPolicyDefinition
51+
52+
data RabbitMQPolicy = RabbitMQPolicy
53+
{ polPattern :: Text,
54+
polApplyTo :: RabbitMQPolicyTarget,
55+
polDefinition :: RabbitMQPolicyDefinition
56+
}
57+
deriving (Show, Generic)
58+
59+
dropPrefixLabelModifier :: String -> String
60+
dropPrefixLabelModifier = lowerFirst . dropPrefix
61+
where
62+
lowerFirst :: String -> String
63+
lowerFirst (x : xs) = toLower x : xs
64+
lowerFirst [] = ""
65+
66+
dropPrefix :: String -> String
67+
dropPrefix = drop (length ("pol" :: String))
68+
69+
instance FromJSON RabbitMQPolicy where
70+
parseJSON =
71+
genericParseJSON $
72+
defaultOptions
73+
{ fieldLabelModifier = dropPrefixLabelModifier
74+
}
75+
76+
instance ToJSON RabbitMQPolicy where
77+
toJSON =
78+
genericToJSON $
79+
defaultOptions
80+
{ fieldLabelModifier = dropPrefixLabelModifier
81+
}
82+
3383
-- | Upstream Docs:
3484
-- https://rawcdn.githack.com/rabbitmq/rabbitmq-server/v3.12.0/deps/rabbitmq_management/priv/www/api/index.html
3585
data AdminAPI route = AdminAPI
@@ -50,6 +100,14 @@ data AdminAPI route = AdminAPI
50100
:> Capture "vhost" VHost
51101
:> Capture "queue" QueueName
52102
:> DeleteNoContent,
103+
addPolicy ::
104+
route
105+
:- "api"
106+
:> "policies"
107+
:> Capture "vhost" VHost
108+
:> Capture "policy_name" Text
109+
:> ReqBody '[JSON] RabbitMQPolicy
110+
:> PutNoContent,
53111
listConnectionsByVHost ::
54112
route
55113
:- "api"

services/background-worker/test/Test/Wire/BackendNotificationPusherSpec.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ mockApi mockAdmin =
403403
AdminAPI
404404
{ listQueuesByVHost = mockListQueuesByVHost mockAdmin,
405405
deleteQueue = mockListDeleteQueue mockAdmin,
406+
addPolicy = todo ("Not required yet." :: String),
406407
listConnectionsByVHost = mockListConnectionsByVHost mockAdmin,
407408
deleteConnection = mockDeleteConnection mockAdmin
408409
}

0 commit comments

Comments
 (0)