40 |
40 |
, DiskTemplate(..)
|
41 |
41 |
, diskTemplateToRaw
|
42 |
42 |
, diskTemplateFromRaw
|
|
43 |
, TagKind(..)
|
|
44 |
, tagKindToRaw
|
|
45 |
, tagKindFromRaw
|
43 |
46 |
, NonNegative
|
44 |
47 |
, fromNonNegative
|
45 |
48 |
, mkNonNegative
|
... | ... | |
53 |
56 |
, fromNonEmpty
|
54 |
57 |
, mkNonEmpty
|
55 |
58 |
, NonEmptyString
|
|
59 |
, QueryResultCode
|
|
60 |
, IPv4Address
|
|
61 |
, mkIPv4Address
|
|
62 |
, IPv4Network
|
|
63 |
, mkIPv4Network
|
|
64 |
, IPv6Address
|
|
65 |
, mkIPv6Address
|
|
66 |
, IPv6Network
|
|
67 |
, mkIPv6Network
|
56 |
68 |
, MigrationMode(..)
|
57 |
69 |
, VerifyOptionalChecks(..)
|
|
70 |
, verifyOptionalChecksToRaw
|
58 |
71 |
, DdmSimple(..)
|
59 |
72 |
, DdmFull(..)
|
60 |
73 |
, CVErrorCode(..)
|
... | ... | |
166 |
179 |
mkNonEmpty [] = fail "Received empty value for non-empty list"
|
167 |
180 |
mkNonEmpty xs = return (NonEmpty xs)
|
168 |
181 |
|
|
182 |
instance (Eq a, Ord a) => Ord (NonEmpty a) where
|
|
183 |
NonEmpty { fromNonEmpty = x1 } `compare` NonEmpty { fromNonEmpty = x2 } =
|
|
184 |
x1 `compare` x2
|
|
185 |
|
169 |
186 |
instance (JSON.JSON a) => JSON.JSON (NonEmpty a) where
|
170 |
187 |
showJSON = JSON.showJSON . fromNonEmpty
|
171 |
188 |
readJSON v = JSON.readJSON v >>= mkNonEmpty
|
... | ... | |
173 |
190 |
-- | A simple type alias for non-empty strings.
|
174 |
191 |
type NonEmptyString = NonEmpty Char
|
175 |
192 |
|
|
193 |
type QueryResultCode = Int
|
|
194 |
|
|
195 |
newtype IPv4Address = IPv4Address { fromIPv4Address :: String }
|
|
196 |
deriving (Show, Eq)
|
|
197 |
|
|
198 |
-- FIXME: this should check that 'address' is a valid ip
|
|
199 |
mkIPv4Address :: Monad m => String -> m IPv4Address
|
|
200 |
mkIPv4Address address =
|
|
201 |
return IPv4Address { fromIPv4Address = address }
|
|
202 |
|
|
203 |
instance JSON.JSON IPv4Address where
|
|
204 |
showJSON = JSON.showJSON . fromIPv4Address
|
|
205 |
readJSON v = JSON.readJSON v >>= mkIPv4Address
|
|
206 |
|
|
207 |
newtype IPv4Network = IPv4Network { fromIPv4Network :: String }
|
|
208 |
deriving (Show, Eq)
|
|
209 |
|
|
210 |
-- FIXME: this should check that 'address' is a valid ip
|
|
211 |
mkIPv4Network :: Monad m => String -> m IPv4Network
|
|
212 |
mkIPv4Network address =
|
|
213 |
return IPv4Network { fromIPv4Network = address }
|
|
214 |
|
|
215 |
instance JSON.JSON IPv4Network where
|
|
216 |
showJSON = JSON.showJSON . fromIPv4Network
|
|
217 |
readJSON v = JSON.readJSON v >>= mkIPv4Network
|
|
218 |
|
|
219 |
newtype IPv6Address = IPv6Address { fromIPv6Address :: String }
|
|
220 |
deriving (Show, Eq)
|
|
221 |
|
|
222 |
-- FIXME: this should check that 'address' is a valid ip
|
|
223 |
mkIPv6Address :: Monad m => String -> m IPv6Address
|
|
224 |
mkIPv6Address address =
|
|
225 |
return IPv6Address { fromIPv6Address = address }
|
|
226 |
|
|
227 |
instance JSON.JSON IPv6Address where
|
|
228 |
showJSON = JSON.showJSON . fromIPv6Address
|
|
229 |
readJSON v = JSON.readJSON v >>= mkIPv6Address
|
|
230 |
|
|
231 |
newtype IPv6Network = IPv6Network { fromIPv6Network :: String }
|
|
232 |
deriving (Show, Eq)
|
|
233 |
|
|
234 |
-- FIXME: this should check that 'address' is a valid ip
|
|
235 |
mkIPv6Network :: Monad m => String -> m IPv6Network
|
|
236 |
mkIPv6Network address =
|
|
237 |
return IPv6Network { fromIPv6Network = address }
|
|
238 |
|
|
239 |
instance JSON.JSON IPv6Network where
|
|
240 |
showJSON = JSON.showJSON . fromIPv6Network
|
|
241 |
readJSON v = JSON.readJSON v >>= mkIPv6Network
|
|
242 |
|
176 |
243 |
-- * Ganeti types
|
177 |
244 |
|
178 |
245 |
-- | Instance disk template type.
|
... | ... | |
192 |
259 |
fromStringRepr = diskTemplateFromRaw
|
193 |
260 |
toStringRepr = diskTemplateToRaw
|
194 |
261 |
|
|
262 |
-- | Data type representing what items the tag operations apply to.
|
|
263 |
$(THH.declareSADT "TagKind"
|
|
264 |
[ ("TagKindInstance", 'C.tagInstance)
|
|
265 |
, ("TagKindNode", 'C.tagNode)
|
|
266 |
, ("TagKindGroup", 'C.tagNodegroup)
|
|
267 |
, ("TagKindCluster", 'C.tagCluster)
|
|
268 |
])
|
|
269 |
$(THH.makeJSONInstance ''TagKind)
|
|
270 |
|
195 |
271 |
-- | The Group allocation policy type.
|
196 |
272 |
--
|
197 |
273 |
-- Note that the order of constructors is important as the automatic
|