Add types and parameters for OpInstanceCreate
[ganeti-local] / htools / Ganeti / OpParams.hs
1 {-# LANGUAGE TemplateHaskell #-}
2
3 {-| Implementation of opcodes parameters.
4
5 These are defined in a separate module only due to TemplateHaskell
6 stage restrictions - expressions defined in the current module can't
7 be passed to splices. So we have to either parameters/repeat each
8 parameter definition multiple times, or separate them into this
9 module.
10
11 -}
12
13 {-
14
15 Copyright (C) 2012 Google Inc.
16
17 This program is free software; you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by
19 the Free Software Foundation; either version 2 of the License, or
20 (at your option) any later version.
21
22 This program is distributed in the hope that it will be useful, but
23 WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25 General Public License for more details.
26
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
29 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30 02110-1301, USA.
31
32 -}
33
34 module Ganeti.OpParams
35   ( TagType(..)
36   , TagObject(..)
37   , tagObjectFrom
38   , decodeTagObject
39   , encodeTagObject
40   , ReplaceDisksMode(..)
41   , DiskIndex
42   , mkDiskIndex
43   , unDiskIndex
44   , DiskAccess(..)
45   , INicParams(..)
46   , IDiskParams(..)
47   , pInstanceName
48   , pInstances
49   , pName
50   , pTagsList
51   , pTagsObject
52   , pOutputFields
53   , pShutdownTimeout
54   , pForce
55   , pIgnoreOfflineNodes
56   , pNodeName
57   , pNodeNames
58   , pGroupName
59   , pMigrationMode
60   , pMigrationLive
61   , pForceVariant
62   , pWaitForSync
63   , pWaitForSyncFalse
64   , pIgnoreConsistency
65   , pStorageName
66   , pUseLocking
67   , pNameCheck
68   , pNodeGroupAllocPolicy
69   , pGroupNodeParams
70   , pQueryWhat
71   , pEarlyRelease
72   , pIpCheck
73   , pIpConflictsCheck
74   , pNoRemember
75   , pMigrationTargetNode
76   , pStartupPaused
77   , pVerbose
78   , pDebugSimulateErrors
79   , pErrorCodes
80   , pSkipChecks
81   , pIgnoreErrors
82   , pOptGroupName
83   , pDiskParams
84   , pHvState
85   , pDiskState
86   , pIgnoreIpolicy
87   , pAllowRuntimeChgs
88   , pInstDisks
89   , pDiskTemplate
90   , pFileDriver
91   , pFileStorageDir
92   , pVgName
93   , pEnabledHypervisors
94   , pHypervisor
95   , pClusterHvParams
96   , pInstHvParams
97   , pClusterBeParams
98   , pInstBeParams
99   , pResetDefaults
100   , pOsHvp
101   , pClusterOsParams
102   , pInstOsParams
103   , pCandidatePoolSize
104   , pUidPool
105   , pAddUids
106   , pRemoveUids
107   , pMaintainNodeHealth
108   , pPreallocWipeDisks
109   , pNicParams
110   , pInstNics
111   , pNdParams
112   , pIpolicy
113   , pDrbdHelper
114   , pDefaultIAllocator
115   , pMasterNetdev
116   , pMasterNetmask
117   , pReservedLvs
118   , pHiddenOs
119   , pBlacklistedOs
120   , pUseExternalMipScript
121   , pQueryFields
122   , pQueryFilter
123   , pOobCommand
124   , pOobTimeout
125   , pIgnoreStatus
126   , pPowerDelay
127   , pPrimaryIp
128   , pSecondaryIp
129   , pReadd
130   , pNodeGroup
131   , pMasterCapable
132   , pVmCapable
133   , pNames
134   , pNodes
135   , pStorageType
136   , pStorageChanges
137   , pMasterCandidate
138   , pOffline
139   , pDrained
140   , pAutoPromote
141   , pPowered
142   , pIallocator
143   , pRemoteNode
144   , pEvacMode
145   , pInstCreateMode
146   , pNoInstall
147   , pInstOs
148   , pPrimaryNode
149   , pSecondaryNode
150   , pSourceHandshake
151   , pSourceInstance
152   , pSourceShutdownTimeout
153   , pSourceX509Ca
154   , pSrcNode
155   , pSrcPath
156   , pStartInstance
157   , pInstTags
158   ) where
159
160 import qualified Data.Set as Set
161 import Text.JSON (readJSON, showJSON, JSON, JSValue(..), fromJSString,
162                   JSObject, toJSObject)
163 import Text.JSON.Pretty (pp_value)
164
165 import Ganeti.BasicTypes
166 import qualified Ganeti.Constants as C
167 import Ganeti.THH
168 import Ganeti.JSON
169 import Ganeti.Types
170 import qualified Ganeti.Query.Language as Qlang
171
172 -- * Helper functions and types
173
174 -- * Type aliases
175
176 -- | Build a boolean field.
177 booleanField :: String -> Field
178 booleanField = flip simpleField [t| Bool |]
179
180 -- | Default a field to 'False'.
181 defaultFalse :: String -> Field
182 defaultFalse = defaultField [| False |] . booleanField
183
184 -- | Default a field to 'True'.
185 defaultTrue :: String -> Field
186 defaultTrue = defaultField [| True |] . booleanField
187
188 -- | An alias for a 'String' field.
189 stringField :: String -> Field
190 stringField = flip simpleField [t| String |]
191
192 -- | An alias for an optional string field.
193 optionalStringField :: String -> Field
194 optionalStringField = optionalField . stringField
195
196 -- | An alias for an optional non-empty string field.
197 optionalNEStringField :: String -> Field
198 optionalNEStringField = optionalField . flip simpleField [t| NonEmptyString |]
199
200 --- | Unchecked value, should be replaced by a better definition.
201 --- type UncheckedValue = JSValue
202
203 -- | Unchecked dict, should be replaced by a better definition.
204 type UncheckedDict = JSObject JSValue
205
206 -- | Unchecked list, shoild be replaced by a better definition.
207 type UncheckedList = [JSValue]
208
209 -- | Function to force a non-negative value, without returning via a
210 -- monad. This is needed for, and should be used /only/ in the case of
211 -- forcing constants. In case the constant is wrong (< 0), this will
212 -- become a runtime error.
213 forceNonNeg :: (Num a, Ord a, Show a) => a -> NonNegative a
214 forceNonNeg i = case mkNonNegative i of
215                   Ok n -> n
216                   Bad msg -> error msg
217
218 -- ** Tags
219
220 -- | Data type representing what items do the tag operations apply to.
221 $(declareSADT "TagType"
222   [ ("TagTypeInstance", 'C.tagInstance)
223   , ("TagTypeNode",     'C.tagNode)
224   , ("TagTypeGroup",    'C.tagNodegroup)
225   , ("TagTypeCluster",  'C.tagCluster)
226   ])
227 $(makeJSONInstance ''TagType)
228
229 -- | Data type holding a tag object (type and object name).
230 data TagObject = TagInstance String
231                | TagNode     String
232                | TagGroup    String
233                | TagCluster
234                deriving (Show, Read, Eq)
235
236 -- | Tag type for a given tag object.
237 tagTypeOf :: TagObject -> TagType
238 tagTypeOf (TagInstance {}) = TagTypeInstance
239 tagTypeOf (TagNode     {}) = TagTypeNode
240 tagTypeOf (TagGroup    {}) = TagTypeGroup
241 tagTypeOf (TagCluster  {}) = TagTypeCluster
242
243 -- | Gets the potential tag object name.
244 tagNameOf :: TagObject -> Maybe String
245 tagNameOf (TagInstance s) = Just s
246 tagNameOf (TagNode     s) = Just s
247 tagNameOf (TagGroup    s) = Just s
248 tagNameOf  TagCluster     = Nothing
249
250 -- | Builds a 'TagObject' from a tag type and name.
251 tagObjectFrom :: (Monad m) => TagType -> JSValue -> m TagObject
252 tagObjectFrom TagTypeInstance (JSString s) =
253   return . TagInstance $ fromJSString s
254 tagObjectFrom TagTypeNode     (JSString s) = return . TagNode $ fromJSString s
255 tagObjectFrom TagTypeGroup    (JSString s) = return . TagGroup $ fromJSString s
256 tagObjectFrom TagTypeCluster   JSNull      = return TagCluster
257 tagObjectFrom t v =
258   fail $ "Invalid tag type/name combination: " ++ show t ++ "/" ++
259          show (pp_value v)
260
261 -- | Name of the tag \"name\" field.
262 tagNameField :: String
263 tagNameField = "name"
264
265 -- | Custom encoder for 'TagObject' as represented in an opcode.
266 encodeTagObject :: TagObject -> (JSValue, [(String, JSValue)])
267 encodeTagObject t = ( showJSON (tagTypeOf t)
268                     , [(tagNameField, maybe JSNull showJSON (tagNameOf t))] )
269
270 -- | Custom decoder for 'TagObject' as represented in an opcode.
271 decodeTagObject :: (Monad m) => [(String, JSValue)] -> JSValue -> m TagObject
272 decodeTagObject obj kind = do
273   ttype <- fromJVal kind
274   tname <- fromObj obj tagNameField
275   tagObjectFrom ttype tname
276
277 -- ** Disks
278
279 -- | Replace disks type.
280 $(declareSADT "ReplaceDisksMode"
281   [ ("ReplaceOnPrimary",    'C.replaceDiskPri)
282   , ("ReplaceOnSecondary",  'C.replaceDiskSec)
283   , ("ReplaceNewSecondary", 'C.replaceDiskChg)
284   , ("ReplaceAuto",         'C.replaceDiskAuto)
285   ])
286 $(makeJSONInstance ''ReplaceDisksMode)
287
288 -- | Disk index type (embedding constraints on the index value via a
289 -- smart constructor).
290 newtype DiskIndex = DiskIndex { unDiskIndex :: Int }
291   deriving (Show, Read, Eq, Ord)
292
293 -- | Smart constructor for 'DiskIndex'.
294 mkDiskIndex :: (Monad m) => Int -> m DiskIndex
295 mkDiskIndex i | i >= 0 && i < C.maxDisks = return (DiskIndex i)
296               | otherwise = fail $ "Invalid value for disk index '" ++
297                             show i ++ "', required between 0 and " ++
298                             show C.maxDisks
299
300 instance JSON DiskIndex where
301   readJSON v = readJSON v >>= mkDiskIndex
302   showJSON = showJSON . unDiskIndex
303
304 -- ** I* param types
305
306 -- | Type holding disk access modes.
307 $(declareSADT "DiskAccess"
308   [ ("DiskReadOnly",  'C.diskRdonly)
309   , ("DiskReadWrite", 'C.diskRdwr)
310   ])
311 $(makeJSONInstance ''DiskAccess)
312
313 -- | NIC modification definition.
314 $(buildObject "INicParams" "inic"
315   [ optionalField $ simpleField C.inicMac  [t| NonEmptyString |]
316   , optionalField $ simpleField C.inicIp   [t| String         |]
317   , optionalField $ simpleField C.inicMode [t| NonEmptyString |]
318   , optionalField $ simpleField C.inicLink [t| NonEmptyString |]
319   ])
320
321 -- | Disk modification definition. FIXME: disksize should be VTYPE_UNIT.
322 $(buildObject "IDiskParams" "idisk"
323   [ optionalField $ simpleField C.idiskSize   [t| Int            |]
324   , optionalField $ simpleField C.idiskMode   [t| DiskAccess     |]
325   , optionalField $ simpleField C.idiskAdopt  [t| NonEmptyString |]
326   , optionalField $ simpleField C.idiskVg     [t| NonEmptyString |]
327   , optionalField $ simpleField C.idiskMetavg [t| NonEmptyString |]
328   ])
329
330 -- * Parameters
331
332 -- | A required instance name (for single-instance LUs).
333 pInstanceName :: Field
334 pInstanceName = simpleField "instance_name" [t| String |]
335
336 -- | A list of instances.
337 pInstances :: Field
338 pInstances = defaultField [| [] |] $
339              simpleField "instances" [t| [NonEmptyString] |]
340
341 -- | A generic name.
342 pName :: Field
343 pName = simpleField "name" [t| NonEmptyString |]
344
345 -- | Tags list.
346 pTagsList :: Field
347 pTagsList = simpleField "tags" [t| [String] |]
348
349 -- | Tags object.
350 pTagsObject :: Field
351 pTagsObject = customField 'decodeTagObject 'encodeTagObject $
352               simpleField "kind" [t| TagObject |]
353
354 -- | Selected output fields.
355 pOutputFields :: Field
356 pOutputFields = simpleField "output_fields" [t| [NonEmptyString] |]
357
358 -- | How long to wait for instance to shut down.
359 pShutdownTimeout :: Field
360 pShutdownTimeout = defaultField [| C.defaultShutdownTimeout |] $
361                    simpleField "shutdown_timeout" [t| NonNegative Int |]
362
363 -- | Whether to force the operation.
364 pForce :: Field
365 pForce = defaultFalse "force"
366
367 -- | Whether to ignore offline nodes.
368 pIgnoreOfflineNodes :: Field
369 pIgnoreOfflineNodes = defaultFalse "ignore_offline_nodes"
370
371 -- | A required node name (for single-node LUs).
372 pNodeName :: Field
373 pNodeName = simpleField "node_name" [t| NonEmptyString |]
374
375 -- | List of nodes.
376 pNodeNames :: Field
377 pNodeNames =
378   defaultField [| [] |] $ simpleField "node_names" [t| [NonEmptyString] |]
379
380 -- | A required node group name (for single-group LUs).
381 pGroupName :: Field
382 pGroupName = simpleField "group_name" [t| NonEmptyString |]
383
384 -- | Migration type (live\/non-live).
385 pMigrationMode :: Field
386 pMigrationMode =
387   renameField "MigrationMode" .
388   optionalField $
389   simpleField "mode" [t| MigrationMode |]
390
391 -- | Obsolete \'live\' migration mode (boolean).
392 pMigrationLive :: Field
393 pMigrationLive =
394   renameField "OldLiveMode" . optionalField $ booleanField "live"
395
396 -- | Whether to force an unknown OS variant.
397 pForceVariant :: Field
398 pForceVariant = defaultFalse "force_variant"
399
400 -- | Whether to wait for the disk to synchronize.
401 pWaitForSync :: Field
402 pWaitForSync = defaultTrue "wait_for_sync"
403
404 -- | Whether to wait for the disk to synchronize (defaults to false).
405 pWaitForSyncFalse :: Field
406 pWaitForSyncFalse = defaultField [| False |] pWaitForSync
407
408 -- | Whether to ignore disk consistency
409 pIgnoreConsistency :: Field
410 pIgnoreConsistency = defaultFalse "ignore_consistency"
411
412 -- | Storage name.
413 pStorageName :: Field
414 pStorageName =
415   renameField "StorageName" $ simpleField "name" [t| NonEmptyString |]
416
417 -- | Whether to use synchronization.
418 pUseLocking :: Field
419 pUseLocking = defaultFalse "use_locking"
420
421 -- | Whether to check name.
422 pNameCheck :: Field
423 pNameCheck = defaultTrue "name_check"
424
425 -- | Instance allocation policy.
426 pNodeGroupAllocPolicy :: Field
427 pNodeGroupAllocPolicy = optionalField $
428                         simpleField "alloc_policy" [t| AllocPolicy |]
429
430 -- | Default node parameters for group.
431 pGroupNodeParams :: Field
432 pGroupNodeParams = optionalField $ simpleField "ndparams" [t| UncheckedDict |]
433
434 -- | Resource(s) to query for.
435 pQueryWhat :: Field
436 pQueryWhat = simpleField "what" [t| Qlang.QueryTypeOp |]
437
438 -- | Whether to release locks as soon as possible.
439 pEarlyRelease :: Field
440 pEarlyRelease = defaultFalse "early_release"
441
442 -- | Whether to ensure instance's IP address is inactive.
443 pIpCheck :: Field
444 pIpCheck = defaultTrue "ip_check"
445
446 -- | Check for conflicting IPs.
447 pIpConflictsCheck :: Field
448 pIpConflictsCheck = defaultTrue "conflicts_check"
449
450 -- | Do not remember instance state changes.
451 pNoRemember :: Field
452 pNoRemember = defaultFalse "no_remember"
453
454 -- | Target node for instance migration/failover.
455 pMigrationTargetNode :: Field
456 pMigrationTargetNode = optionalNEStringField "target_node"
457
458 -- | Pause instance at startup.
459 pStartupPaused :: Field
460 pStartupPaused = defaultFalse "startup_paused"
461
462 -- | Verbose mode.
463 pVerbose :: Field
464 pVerbose = defaultFalse "verbose"
465
466 -- ** Parameters for cluster verification
467
468 -- | Whether to simulate errors (useful for debugging).
469 pDebugSimulateErrors :: Field
470 pDebugSimulateErrors = defaultFalse "debug_simulate_errors"
471
472 -- | Error codes.
473 pErrorCodes :: Field
474 pErrorCodes = defaultFalse "error_codes"
475
476 -- | Which checks to skip.
477 pSkipChecks :: Field
478 pSkipChecks = defaultField [| Set.empty |] $
479               simpleField "skip_checks" [t| Set.Set VerifyOptionalChecks |]
480
481 -- | List of error codes that should be treated as warnings.
482 pIgnoreErrors :: Field
483 pIgnoreErrors = defaultField [| Set.empty |] $
484                 simpleField "ignore_errors" [t| Set.Set CVErrorCode |]
485
486 -- | Optional group name.
487 pOptGroupName :: Field
488 pOptGroupName = renameField "OptGroupName" .
489                 optionalField $ simpleField "group_name" [t| NonEmptyString |]
490
491 -- | Disk templates' parameter defaults.
492 pDiskParams :: Field
493 pDiskParams = optionalField $
494               simpleField "diskparams" [t| GenericContainer DiskTemplate
495                                            UncheckedDict |]
496
497 -- * Parameters for node resource model
498
499 -- | Set hypervisor states.
500 pHvState :: Field
501 pHvState = optionalField $ simpleField "hv_state" [t| UncheckedDict |]
502
503 -- | Set disk states.
504 pDiskState :: Field
505 pDiskState = optionalField $ simpleField "disk_state" [t| UncheckedDict |]
506
507 -- | Whether to ignore ipolicy violations.
508 pIgnoreIpolicy :: Field
509 pIgnoreIpolicy = defaultFalse "ignore_ipolicy"
510
511 -- | Allow runtime changes while migrating.
512 pAllowRuntimeChgs :: Field
513 pAllowRuntimeChgs = defaultTrue "allow_runtime_changes"
514
515 -- | Utility type for OpClusterSetParams.
516 type TestClusterOsListItem = (DdmSimple, NonEmptyString)
517
518 -- | Utility type of OsList.
519 type TestClusterOsList = [TestClusterOsListItem]
520
521 -- Utility type for NIC definitions.
522 --type TestNicDef = INicParams
523
524 -- | List of instance disks.
525 pInstDisks :: Field
526 pInstDisks = renameField "instDisks" $ simpleField "disks" [t| [IDiskParams] |]
527
528 -- | Instance disk template.
529 pDiskTemplate :: Field
530 pDiskTemplate = simpleField "disk_template" [t| DiskTemplate |]
531
532 -- | File driver.
533 pFileDriver :: Field
534 pFileDriver = optionalField $ simpleField "file_driver" [t| FileDriver |]
535
536 -- | Directory for storing file-backed disks.
537 pFileStorageDir :: Field
538 pFileStorageDir = optionalNEStringField "file_storage_dir"
539
540 -- | Volume group name.
541 pVgName :: Field
542 pVgName = optionalStringField "vg_name"
543
544 -- | List of enabled hypervisors.
545 pEnabledHypervisors :: Field
546 pEnabledHypervisors =
547   optionalField $
548   simpleField "enabled_hypervisors" [t| NonEmpty Hypervisor |]
549
550 -- | Selected hypervisor for an instance.
551 pHypervisor :: Field
552 pHypervisor =
553   optionalField $
554   simpleField "hypervisor" [t| Hypervisor |]
555
556 -- | Cluster-wide hypervisor parameters, hypervisor-dependent.
557 pClusterHvParams :: Field
558 pClusterHvParams =
559   renameField "ClusterHvParams" .
560   optionalField $
561   simpleField "hvparams" [t| Container UncheckedDict |]
562
563 -- | Instance hypervisor parameters.
564 pInstHvParams :: Field
565 pInstHvParams =
566   renameField "InstHvParams" .
567   defaultField [| toJSObject [] |] $
568   simpleField "hvparams" [t| UncheckedDict |]
569
570 -- | Cluster-wide beparams.
571 pClusterBeParams :: Field
572 pClusterBeParams =
573   renameField "ClusterBeParams" .
574   optionalField $ simpleField "beparams" [t| UncheckedDict |]
575
576 -- | Instance beparams.
577 pInstBeParams :: Field
578 pInstBeParams =
579   renameField "InstBeParams" .
580   defaultField [| toJSObject [] |] $
581   simpleField "beparams" [t| UncheckedDict |]
582
583 -- | Reset instance parameters to default if equal.
584 pResetDefaults :: Field
585 pResetDefaults = defaultFalse "identify_defaults"
586
587 -- | Cluster-wide per-OS hypervisor parameter defaults.
588 pOsHvp :: Field
589 pOsHvp = optionalField $ simpleField "os_hvp" [t| Container UncheckedDict |]
590
591 -- | Cluster-wide OS parameter defaults.
592 pClusterOsParams :: Field
593 pClusterOsParams =
594   renameField "clusterOsParams" .
595   optionalField $ simpleField "osparams" [t| Container UncheckedDict |]
596
597 -- | Instance OS parameters.
598 pInstOsParams :: Field
599 pInstOsParams =
600   renameField "instOsParams" . defaultField [| toJSObject [] |] $
601   simpleField "osparams" [t| UncheckedDict |]
602
603 -- | Candidate pool size.
604 pCandidatePoolSize :: Field
605 pCandidatePoolSize =
606   optionalField $ simpleField "candidate_pool_size" [t| Positive Int |]
607
608 -- | Set UID pool, must be list of lists describing UID ranges (two
609 -- items, start and end inclusive.
610 pUidPool :: Field
611 pUidPool = optionalField $ simpleField "uid_pool" [t| [[(Int, Int)]] |]
612
613 -- | Extend UID pool, must be list of lists describing UID ranges (two
614 -- items, start and end inclusive.
615 pAddUids :: Field
616 pAddUids = optionalField $ simpleField "add_uids" [t| [[(Int, Int)]] |]
617
618 -- | Shrink UID pool, must be list of lists describing UID ranges (two
619 -- items, start and end inclusive) to be removed.
620 pRemoveUids :: Field
621 pRemoveUids = optionalField $ simpleField "remove_uids" [t| [[(Int, Int)]] |]
622
623 -- | Whether to automatically maintain node health.
624 pMaintainNodeHealth :: Field
625 pMaintainNodeHealth = optionalField $ booleanField "maintain_node_health"
626
627 -- | Whether to wipe disks before allocating them to instances.
628 pPreallocWipeDisks :: Field
629 pPreallocWipeDisks = optionalField $ booleanField "prealloc_wipe_disks"
630
631 -- | Cluster-wide NIC parameter defaults.
632 pNicParams :: Field
633 pNicParams = optionalField $ simpleField "nicparams" [t| INicParams |]
634
635 -- | Instance NIC definitions.
636 pInstNics :: Field
637 pInstNics = simpleField "nics" [t| [INicParams] |]
638
639 -- | Cluster-wide node parameter defaults.
640 pNdParams :: Field
641 pNdParams = optionalField $ simpleField "ndparams" [t| UncheckedDict |]
642
643 -- | Cluster-wipe ipolict specs.
644 pIpolicy :: Field
645 pIpolicy = optionalField $ simpleField "ipolicy" [t| UncheckedDict |]
646
647 -- | DRBD helper program.
648 pDrbdHelper :: Field
649 pDrbdHelper = optionalStringField "drbd_helper"
650
651 -- | Default iallocator for cluster.
652 pDefaultIAllocator :: Field
653 pDefaultIAllocator = optionalStringField "default_iallocator"
654
655 -- | Master network device.
656 pMasterNetdev :: Field
657 pMasterNetdev = optionalStringField "master_netdev"
658
659 -- | Netmask of the master IP.
660 pMasterNetmask :: Field
661 pMasterNetmask = optionalField $ simpleField "master_netmask" [t| Int |]
662
663 -- | List of reserved LVs.
664 pReservedLvs :: Field
665 pReservedLvs =
666   optionalField $ simpleField "reserved_lvs" [t| [NonEmptyString] |]
667
668 -- | Modify list of hidden operating systems: each modification must
669 -- have two items, the operation and the OS name; the operation can be
670 -- add or remove.
671 pHiddenOs :: Field
672 pHiddenOs = optionalField $ simpleField "hidden_os" [t| TestClusterOsList |]
673
674 -- | Modify list of blacklisted operating systems: each modification
675 -- must have two items, the operation and the OS name; the operation
676 -- can be add or remove.
677 pBlacklistedOs :: Field
678 pBlacklistedOs =
679   optionalField $ simpleField "blacklisted_os" [t| TestClusterOsList |]
680
681 -- | Whether to use an external master IP address setup script.
682 pUseExternalMipScript :: Field
683 pUseExternalMipScript = optionalField $ booleanField "use_external_mip_script"
684
685 -- | Requested fields.
686 pQueryFields :: Field
687 pQueryFields = simpleField "fields" [t| [NonEmptyString] |]
688
689 -- | Query filter.
690 pQueryFilter :: Field
691 pQueryFilter = simpleField "qfilter" [t| Qlang.Filter String |]
692
693 -- | OOB command to run.
694 pOobCommand :: Field
695 pOobCommand = simpleField "command" [t| OobCommand |]
696
697 -- | Timeout before the OOB helper will be terminated.
698 pOobTimeout :: Field
699 pOobTimeout =
700   defaultField [| C.oobTimeout |] $ simpleField "timeout" [t| Int |]
701
702 -- | Ignores the node offline status for power off.
703 pIgnoreStatus :: Field
704 pIgnoreStatus = defaultFalse "ignore_status"
705
706 -- | Time in seconds to wait between powering on nodes.
707 pPowerDelay :: Field
708 pPowerDelay =
709   -- FIXME: we can't use the proper type "NonNegative Double", since
710   -- the default constant is a plain Double, not a non-negative one.
711   defaultField [| C.oobPowerDelay |] $
712   simpleField "power_delay" [t| Double |]
713
714 -- | Primary IP address.
715 pPrimaryIp :: Field
716 pPrimaryIp = optionalStringField "primary_ip"
717
718 -- | Secondary IP address.
719 pSecondaryIp :: Field
720 pSecondaryIp = optionalNEStringField "secondary_ip"
721
722 -- | Whether node is re-added to cluster.
723 pReadd :: Field
724 pReadd = defaultFalse "readd"
725
726 -- | Initial node group.
727 pNodeGroup :: Field
728 pNodeGroup = optionalNEStringField "group"
729
730 -- | Whether node can become master or master candidate.
731 pMasterCapable :: Field
732 pMasterCapable = optionalField $ booleanField "master_capable"
733
734 -- | Whether node can host instances.
735 pVmCapable :: Field
736 pVmCapable = optionalField $ booleanField "vm_capable"
737
738 -- | List of names.
739 pNames :: Field
740 pNames = defaultField [| [] |] $ simpleField "names" [t| [NonEmptyString] |]
741
742 -- | List of node names.
743 pNodes :: Field
744 pNodes = defaultField [| [] |] $ simpleField "nodes" [t| [NonEmptyString] |]
745
746 -- | Storage type.
747 pStorageType :: Field
748 pStorageType = simpleField "storage_type" [t| StorageType |]
749
750 -- | Storage changes (unchecked).
751 pStorageChanges :: Field
752 pStorageChanges = simpleField "changes" [t| UncheckedDict |]
753
754 -- | Whether the node should become a master candidate.
755 pMasterCandidate :: Field
756 pMasterCandidate = optionalField $ booleanField "master_candidate"
757
758 -- | Whether the node should be marked as offline.
759 pOffline :: Field
760 pOffline = optionalField $ booleanField "offline"
761
762 -- | Whether the node should be marked as drained.
763 pDrained ::Field
764 pDrained = optionalField $ booleanField "drained"
765
766 -- | Whether node(s) should be promoted to master candidate if necessary.
767 pAutoPromote :: Field
768 pAutoPromote = defaultFalse "auto_promote"
769
770 -- | Whether the node should be marked as powered
771 pPowered :: Field
772 pPowered = optionalField $ booleanField "powered"
773
774 -- | Iallocator for deciding the target node for shared-storage
775 -- instances during migrate and failover.
776 pIallocator :: Field
777 pIallocator = optionalNEStringField "iallocator"
778
779 -- | New secondary node.
780 pRemoteNode :: Field
781 pRemoteNode = optionalNEStringField "remote_node"
782
783 -- | Node evacuation mode.
784 pEvacMode :: Field
785 pEvacMode = renameField "EvacMode" $ simpleField "mode" [t| NodeEvacMode |]
786
787 -- | Instance creation mode.
788 pInstCreateMode :: Field
789 pInstCreateMode =
790   renameField "InstCreateMode" $ simpleField "mode" [t| InstCreateMode |]
791
792 -- | Do not install the OS (will disable automatic start).
793 pNoInstall :: Field
794 pNoInstall = optionalField $ booleanField "no_install"
795
796 -- | OS type for instance installation.
797 pInstOs :: Field
798 pInstOs = optionalNEStringField "os_type"
799
800 -- | Primary node for an instance.
801 pPrimaryNode :: Field
802 pPrimaryNode = optionalNEStringField "pnode"
803
804 -- | Secondary node for an instance.
805 pSecondaryNode :: Field
806 pSecondaryNode = optionalNEStringField "snode"
807
808 -- | Signed handshake from source (remote import only).
809 pSourceHandshake :: Field
810 pSourceHandshake =
811   optionalField $ simpleField "source_handshake" [t| UncheckedList |]
812
813 -- | Source instance name (remote import only).
814 pSourceInstance :: Field
815 pSourceInstance = optionalNEStringField "source_instance_name"
816
817 -- | How long source instance was given to shut down (remote import only).
818 -- FIXME: non-negative int, whereas the constant is a plain int.
819 pSourceShutdownTimeout :: Field
820 pSourceShutdownTimeout =
821   defaultField [| forceNonNeg C.defaultShutdownTimeout |] $
822   simpleField "source_shutdown_timeout" [t| NonNegative Int |]
823
824 -- | Source X509 CA in PEM format (remote import only).
825 pSourceX509Ca :: Field
826 pSourceX509Ca = optionalNEStringField "source_x509_ca"
827
828 -- | Source node for import.
829 pSrcNode :: Field
830 pSrcNode = optionalNEStringField "src_node"
831
832 -- | Source directory for import.
833 pSrcPath :: Field
834 pSrcPath = optionalNEStringField "src_path"
835
836 -- | Whether to start instance after creation.
837 pStartInstance :: Field
838 pStartInstance = defaultTrue "start"
839
840 -- | Instance tags. FIXME: unify/simplify with pTags, once that
841 -- migrates to NonEmpty String.
842 pInstTags :: Field
843 pInstTags =
844   renameField "InstTags" .
845   defaultField [| [] |] $
846   simpleField "tags" [t| [NonEmptyString] |]