Removes obsolete 'enabled storage types'
[ganeti-local] / src / Ganeti / OpCodes.hs
1 {-# LANGUAGE TemplateHaskell #-}
2
3 {-| Implementation of the opcodes.
4
5 -}
6
7 {-
8
9 Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 02110-1301, USA.
25
26 -}
27
28 module Ganeti.OpCodes
29   ( OpCode(..)
30   , TagObject(..)
31   , tagObjectFrom
32   , encodeTagObject
33   , decodeTagObject
34   , ReplaceDisksMode(..)
35   , DiskIndex
36   , mkDiskIndex
37   , unDiskIndex
38   , opID
39   , allOpIDs
40   , allOpFields
41   , opSummary
42   , CommonOpParams(..)
43   , defOpParams
44   , MetaOpCode(..)
45   , wrapOpCode
46   , setOpComment
47   , setOpPriority
48   ) where
49
50 import Data.Maybe (fromMaybe)
51 import Text.JSON (readJSON, showJSON, JSON, JSValue, makeObj)
52 import qualified Text.JSON
53
54 import Ganeti.THH
55
56 import Ganeti.OpParams
57 import Ganeti.Types (OpSubmitPriority(..), fromNonEmpty)
58 import Ganeti.Query.Language (queryTypeOpToRaw)
59
60 -- | OpCode representation.
61 --
62 -- We only implement a subset of Ganeti opcodes: those which are actually used
63 -- in the htools codebase.
64 $(genOpCode "OpCode"
65   [ ("OpTestDelay",
66      [ pDelayDuration
67      , pDelayOnMaster
68      , pDelayOnNodes
69      , pDelayRepeat
70      ])
71   , ("OpInstanceReplaceDisks",
72      [ pInstanceName
73      , pEarlyRelease
74      , pIgnoreIpolicy
75      , pReplaceDisksMode
76      , pReplaceDisksList
77      , pRemoteNode
78      , pIallocator
79      ])
80   , ("OpInstanceFailover",
81      [ pInstanceName
82      , pShutdownTimeout
83      , pIgnoreConsistency
84      , pMigrationTargetNode
85      , pIgnoreIpolicy
86      , pIallocator
87      ])
88   , ("OpInstanceMigrate",
89      [ pInstanceName
90      , pMigrationMode
91      , pMigrationLive
92      , pMigrationTargetNode
93      , pAllowRuntimeChgs
94      , pIgnoreIpolicy
95      , pMigrationCleanup
96      , pIallocator
97      , pAllowFailover
98      ])
99   , ("OpTagsGet",
100      [ pTagsObject
101      , pUseLocking
102      ])
103   , ("OpTagsSearch",
104      [ pTagSearchPattern ])
105   , ("OpTagsSet",
106      [ pTagsObject
107      , pTagsList
108      ])
109   , ("OpTagsDel",
110      [ pTagsObject
111      , pTagsList
112      ])
113   , ("OpClusterPostInit", [])
114   , ("OpClusterDestroy", [])
115   , ("OpClusterQuery", [])
116   , ("OpClusterVerify",
117      [ pDebugSimulateErrors
118      , pErrorCodes
119      , pSkipChecks
120      , pIgnoreErrors
121      , pVerbose
122      , pOptGroupName
123      ])
124   , ("OpClusterVerifyConfig",
125      [ pDebugSimulateErrors
126      , pErrorCodes
127      , pIgnoreErrors
128      , pVerbose
129      ])
130   , ("OpClusterVerifyGroup",
131      [ pGroupName
132      , pDebugSimulateErrors
133      , pErrorCodes
134      , pSkipChecks
135      , pIgnoreErrors
136      , pVerbose
137      ])
138   , ("OpClusterVerifyDisks", [])
139   , ("OpGroupVerifyDisks",
140      [ pGroupName
141      ])
142   , ("OpClusterRepairDiskSizes",
143      [ pInstances
144      ])
145   , ("OpClusterConfigQuery",
146      [ pOutputFields
147      ])
148   , ("OpClusterRename",
149      [ pName
150      ])
151   , ("OpClusterSetParams",
152      [ pHvState
153      , pDiskState
154      , pVgName
155      , pEnabledHypervisors
156      , pClusterHvParams
157      , pClusterBeParams
158      , pOsHvp
159      , pClusterOsParams
160      , pDiskParams
161      , pCandidatePoolSize
162      , pUidPool
163      , pAddUids
164      , pRemoveUids
165      , pMaintainNodeHealth
166      , pPreallocWipeDisks
167      , pNicParams
168      , pNdParams
169      , pIpolicy
170      , pDrbdHelper
171      , pDefaultIAllocator
172      , pMasterNetdev
173      , pMasterNetmask
174      , pReservedLvs
175      , pHiddenOs
176      , pBlacklistedOs
177      , pUseExternalMipScript
178      , pEnabledDiskTemplates
179      ])
180   , ("OpClusterRedistConf", [])
181   , ("OpClusterActivateMasterIp", [])
182   , ("OpClusterDeactivateMasterIp", [])
183   , ("OpQuery",
184      [ pQueryWhat
185      , pUseLocking
186      , pQueryFields
187      , pQueryFilter
188      ])
189   , ("OpQueryFields",
190      [ pQueryWhat
191      , pQueryFields
192      ])
193   , ("OpOobCommand",
194      [ pNodeNames
195      , pOobCommand
196      , pOobTimeout
197      , pIgnoreStatus
198      , pPowerDelay
199      ])
200   , ("OpNodeRemove", [ pNodeName ])
201   , ("OpNodeAdd",
202      [ pNodeName
203      , pHvState
204      , pDiskState
205      , pPrimaryIp
206      , pSecondaryIp
207      , pReadd
208      , pNodeGroup
209      , pMasterCapable
210      , pVmCapable
211      , pNdParams
212     ])
213   , ("OpNodeQuery", dOldQuery)
214   , ("OpNodeQueryvols",
215      [ pOutputFields
216      , pNodes
217      ])
218   , ("OpNodeQueryStorage",
219      [ pOutputFields
220      , pStorageType
221      , pNodes
222      , pStorageName
223      ])
224   , ("OpNodeModifyStorage",
225      [ pNodeName
226      , pStorageType
227      , pStorageName
228      , pStorageChanges
229      ])
230   , ("OpRepairNodeStorage",
231      [ pNodeName
232      , pStorageType
233      , pStorageName
234      , pIgnoreConsistency
235      ])
236   , ("OpNodeSetParams",
237      [ pNodeName
238      , pForce
239      , pHvState
240      , pDiskState
241      , pMasterCandidate
242      , pOffline
243      , pDrained
244      , pAutoPromote
245      , pMasterCapable
246      , pVmCapable
247      , pSecondaryIp
248      , pNdParams
249      , pPowered
250      ])
251   , ("OpNodePowercycle",
252      [ pNodeName
253      , pForce
254      ])
255   , ("OpNodeMigrate",
256      [ pNodeName
257      , pMigrationMode
258      , pMigrationLive
259      , pMigrationTargetNode
260      , pAllowRuntimeChgs
261      , pIgnoreIpolicy
262      , pIallocator
263      ])
264   , ("OpNodeEvacuate",
265      [ pEarlyRelease
266      , pNodeName
267      , pRemoteNode
268      , pIallocator
269      , pEvacMode
270      ])
271   , ("OpInstanceCreate",
272      [ pInstanceName
273      , pForceVariant
274      , pWaitForSync
275      , pNameCheck
276      , pIgnoreIpolicy
277      , pInstBeParams
278      , pInstDisks
279      , pDiskTemplate
280      , pFileDriver
281      , pFileStorageDir
282      , pInstHvParams
283      , pHypervisor
284      , pIallocator
285      , pResetDefaults
286      , pIpCheck
287      , pIpConflictsCheck
288      , pInstCreateMode
289      , pInstNics
290      , pNoInstall
291      , pInstOsParams
292      , pInstOs
293      , pPrimaryNode
294      , pSecondaryNode
295      , pSourceHandshake
296      , pSourceInstance
297      , pSourceShutdownTimeout
298      , pSourceX509Ca
299      , pSrcNode
300      , pSrcPath
301      , pStartInstance
302      , pOpportunisticLocking
303      , pInstTags
304      ])
305   , ("OpInstanceMultiAlloc",
306      [ pIallocator
307      , pMultiAllocInstances
308      , pOpportunisticLocking
309      ])
310   , ("OpInstanceReinstall",
311      [ pInstanceName
312      , pForceVariant
313      , pInstOs
314      , pTempOsParams
315      ])
316   , ("OpInstanceRemove",
317      [ pInstanceName
318      , pShutdownTimeout
319      , pIgnoreFailures
320      ])
321   , ("OpInstanceRename",
322      [ pInstanceName
323      , pNewName
324      , pNameCheck
325      , pIpCheck
326      ])
327   , ("OpInstanceStartup",
328      [ pInstanceName
329      , pForce
330      , pIgnoreOfflineNodes
331      , pTempHvParams
332      , pTempBeParams
333      , pNoRemember
334      , pStartupPaused
335      ])
336   , ("OpInstanceShutdown",
337      [ pInstanceName
338      , pForce
339      , pIgnoreOfflineNodes
340      , pShutdownTimeout'
341      , pNoRemember
342      ])
343   , ("OpInstanceReboot",
344      [ pInstanceName
345      , pShutdownTimeout
346      , pIgnoreSecondaries
347      , pRebootType
348      , pReason
349      ])
350   , ("OpInstanceMove",
351      [ pInstanceName
352      , pShutdownTimeout
353      , pIgnoreIpolicy
354      , pMoveTargetNode
355      , pIgnoreConsistency
356      ])
357   , ("OpInstanceConsole",
358      [ pInstanceName ])
359   , ("OpInstanceActivateDisks",
360      [ pInstanceName
361      , pIgnoreDiskSize
362      , pWaitForSyncFalse
363      ])
364   , ("OpInstanceDeactivateDisks",
365      [ pInstanceName
366      , pForce
367      ])
368   , ("OpInstanceRecreateDisks",
369      [ pInstanceName
370      , pRecreateDisksInfo
371      , pNodes
372      , pIallocator
373      ])
374   , ("OpInstanceQuery", dOldQuery)
375   , ("OpInstanceQueryData",
376      [ pUseLocking
377      , pInstances
378      , pStatic
379      ])
380   , ("OpInstanceSetParams",
381      [ pInstanceName
382      , pForce
383      , pForceVariant
384      , pIgnoreIpolicy
385      , pInstParamsNicChanges
386      , pInstParamsDiskChanges
387      , pInstBeParams
388      , pRuntimeMem
389      , pInstHvParams
390      , pOptDiskTemplate
391      , pPrimaryNode
392      , pRemoteNode
393      , pOsNameChange
394      , pInstOsParams
395      , pWaitForSync
396      , pOffline
397      , pIpConflictsCheck
398      ])
399   , ("OpInstanceGrowDisk",
400      [ pInstanceName
401      , pWaitForSync
402      , pDiskIndex
403      , pDiskChgAmount
404      , pDiskChgAbsolute
405      ])
406   , ("OpInstanceChangeGroup",
407      [ pInstanceName
408      , pEarlyRelease
409      , pIallocator
410      , pTargetGroups
411      ])
412   , ("OpGroupAdd",
413      [ pGroupName
414      , pNodeGroupAllocPolicy
415      , pGroupNodeParams
416      , pDiskParams
417      , pHvState
418      , pDiskState
419      , pIpolicy
420      ])
421   , ("OpGroupAssignNodes",
422      [ pGroupName
423      , pForce
424      , pRequiredNodes
425      ])
426   , ("OpGroupQuery", dOldQueryNoLocking)
427   , ("OpGroupSetParams",
428      [ pGroupName
429      , pNodeGroupAllocPolicy
430      , pGroupNodeParams
431      , pDiskParams
432      , pHvState
433      , pDiskState
434      , pIpolicy
435      ])
436   , ("OpGroupRemove",
437      [ pGroupName ])
438   , ("OpGroupRename",
439      [ pGroupName
440      , pNewName
441      ])
442   , ("OpGroupEvacuate",
443      [ pGroupName
444      , pEarlyRelease
445      , pIallocator
446      , pTargetGroups
447      ])
448   , ("OpOsDiagnose",
449      [ pOutputFields
450      , pNames ])
451   , ("OpExtStorageDiagnose",
452      [ pOutputFields
453      , pNames ])
454   , ("OpBackupQuery",
455      [ pUseLocking
456      , pNodes
457      ])
458   , ("OpBackupPrepare",
459      [ pInstanceName
460      , pExportMode
461      ])
462   , ("OpBackupExport",
463      [ pInstanceName
464      , pShutdownTimeout
465      , pExportTargetNode
466      , pShutdownInstance
467      , pRemoveInstance
468      , pIgnoreRemoveFailures
469      , pExportMode
470      , pX509KeyName
471      , pX509DestCA
472      ])
473   , ("OpBackupRemove",
474      [ pInstanceName ])
475   , ("OpTestAllocator",
476      [ pIAllocatorDirection
477      , pIAllocatorMode
478      , pIAllocatorReqName
479      , pIAllocatorNics
480      , pIAllocatorDisks
481      , pHypervisor
482      , pIallocator
483      , pInstTags
484      , pIAllocatorMemory
485      , pIAllocatorVCpus
486      , pIAllocatorOs
487      , pDiskTemplate
488      , pIAllocatorInstances
489      , pIAllocatorEvacMode
490      , pTargetGroups
491      , pIAllocatorSpindleUse
492      , pIAllocatorCount
493      ])
494   , ("OpTestJqueue",
495      [ pJQueueNotifyWaitLock
496      , pJQueueNotifyExec
497      , pJQueueLogMessages
498      , pJQueueFail
499      ])
500   , ("OpTestDummy",
501      [ pTestDummyResult
502      , pTestDummyMessages
503      , pTestDummyFail
504      , pTestDummySubmitJobs
505      ])
506   , ("OpNetworkAdd",
507      [ pNetworkName
508      , pNetworkAddress4
509      , pNetworkGateway4
510      , pNetworkAddress6
511      , pNetworkGateway6
512      , pNetworkMacPrefix
513      , pNetworkAddRsvdIps
514      , pIpConflictsCheck
515      , pInstTags
516      ])
517   , ("OpNetworkRemove",
518      [ pNetworkName
519      , pForce
520      ])
521   , ("OpNetworkSetParams",
522      [ pNetworkName
523      , pNetworkGateway4
524      , pNetworkAddress6
525      , pNetworkGateway6
526      , pNetworkMacPrefix
527      , pNetworkAddRsvdIps
528      , pNetworkRemoveRsvdIps
529      ])
530   , ("OpNetworkConnect",
531      [ pGroupName
532      , pNetworkName
533      , pNetworkMode
534      , pNetworkLink
535      , pIpConflictsCheck
536      ])
537   , ("OpNetworkDisconnect",
538      [ pGroupName
539      , pNetworkName
540      ])
541   , ("OpNetworkQuery", dOldQuery)
542   , ("OpRestrictedCommand",
543      [ pUseLocking
544      , pRequiredNodes
545      , pRestrictedCommand
546      ])
547   ])
548
549 -- | Returns the OP_ID for a given opcode value.
550 $(genOpID ''OpCode "opID")
551
552 -- | A list of all defined/supported opcode IDs.
553 $(genAllOpIDs ''OpCode "allOpIDs")
554
555 instance JSON OpCode where
556   readJSON = loadOpCode
557   showJSON = saveOpCode
558
559 -- | Generates the summary value for an opcode.
560 opSummaryVal :: OpCode -> Maybe String
561 opSummaryVal OpClusterVerifyGroup { opGroupName = s } = Just (fromNonEmpty s)
562 opSummaryVal OpGroupVerifyDisks { opGroupName = s } = Just (fromNonEmpty s)
563 opSummaryVal OpClusterRename { opName = s } = Just (fromNonEmpty s)
564 opSummaryVal OpQuery { opWhat = s } = Just (queryTypeOpToRaw s)
565 opSummaryVal OpQueryFields { opWhat = s } = Just (queryTypeOpToRaw s)
566 opSummaryVal OpNodeRemove { opNodeName = s } = Just (fromNonEmpty s)
567 opSummaryVal OpNodeAdd { opNodeName = s } = Just (fromNonEmpty s)
568 opSummaryVal OpNodeModifyStorage { opNodeName = s } = Just (fromNonEmpty s)
569 opSummaryVal OpRepairNodeStorage  { opNodeName = s } = Just (fromNonEmpty s)
570 opSummaryVal OpNodeSetParams { opNodeName = s } = Just (fromNonEmpty s)
571 opSummaryVal OpNodePowercycle { opNodeName = s } = Just (fromNonEmpty s)
572 opSummaryVal OpNodeMigrate { opNodeName = s } = Just (fromNonEmpty s)
573 opSummaryVal OpNodeEvacuate { opNodeName = s } = Just (fromNonEmpty s)
574 opSummaryVal OpInstanceCreate { opInstanceName = s } = Just s
575 opSummaryVal OpInstanceReinstall { opInstanceName = s } = Just s
576 opSummaryVal OpInstanceRemove { opInstanceName = s } = Just s
577 -- FIXME: instance rename should show both names; currently it shows none
578 -- opSummaryVal OpInstanceRename { opInstanceName = s } = Just s
579 opSummaryVal OpInstanceStartup { opInstanceName = s } = Just s
580 opSummaryVal OpInstanceShutdown { opInstanceName = s } = Just s
581 opSummaryVal OpInstanceReboot { opInstanceName = s } = Just s
582 opSummaryVal OpInstanceReplaceDisks { opInstanceName = s } = Just s
583 opSummaryVal OpInstanceFailover { opInstanceName = s } = Just s
584 opSummaryVal OpInstanceMigrate { opInstanceName = s } = Just s
585 opSummaryVal OpInstanceMove { opInstanceName = s } = Just s
586 opSummaryVal OpInstanceConsole { opInstanceName = s } = Just s
587 opSummaryVal OpInstanceActivateDisks { opInstanceName = s } = Just s
588 opSummaryVal OpInstanceDeactivateDisks { opInstanceName = s } = Just s
589 opSummaryVal OpInstanceRecreateDisks { opInstanceName = s } = Just s
590 opSummaryVal OpInstanceSetParams { opInstanceName = s } = Just s
591 opSummaryVal OpInstanceGrowDisk { opInstanceName = s } = Just s
592 opSummaryVal OpInstanceChangeGroup { opInstanceName = s } = Just s
593 opSummaryVal OpGroupAdd { opGroupName = s } = Just (fromNonEmpty s)
594 opSummaryVal OpGroupAssignNodes { opGroupName = s } = Just (fromNonEmpty s)
595 opSummaryVal OpGroupSetParams { opGroupName = s } = Just (fromNonEmpty s)
596 opSummaryVal OpGroupRemove { opGroupName = s } = Just (fromNonEmpty s)
597 opSummaryVal OpGroupEvacuate { opGroupName = s } = Just (fromNonEmpty s)
598 opSummaryVal OpBackupPrepare { opInstanceName = s } = Just s
599 opSummaryVal OpBackupExport { opInstanceName = s } = Just s
600 opSummaryVal OpBackupRemove { opInstanceName = s } = Just s
601 opSummaryVal OpTagsGet { opKind = k } =
602   Just . fromMaybe "None" $ tagNameOf k
603 opSummaryVal OpTagsSearch { opTagSearchPattern = s } = Just (fromNonEmpty s)
604 opSummaryVal OpTestDelay { opDelayDuration = d } = Just (show d)
605 opSummaryVal OpTestAllocator { opIallocator = s } =
606   -- FIXME: Python doesn't handle None fields well, so we have behave the same
607   Just $ maybe "None" fromNonEmpty s
608 opSummaryVal OpNetworkAdd { opNetworkName = s} = Just (fromNonEmpty s)
609 opSummaryVal OpNetworkRemove { opNetworkName = s} = Just (fromNonEmpty s)
610 opSummaryVal OpNetworkSetParams { opNetworkName = s} = Just (fromNonEmpty s)
611 opSummaryVal OpNetworkConnect { opNetworkName = s} = Just (fromNonEmpty s)
612 opSummaryVal OpNetworkDisconnect { opNetworkName = s} = Just (fromNonEmpty s)
613 opSummaryVal _ = Nothing
614
615 -- | Computes the summary of the opcode.
616 opSummary :: OpCode -> String
617 opSummary op =
618   case opSummaryVal op of
619     Nothing -> op_suffix
620     Just s -> op_suffix ++ "(" ++ s ++ ")"
621   where op_suffix = drop 3 $ opID op
622
623 -- | Generic\/common opcode parameters.
624 $(buildObject "CommonOpParams" "op"
625   [ pDryRun
626   , pDebugLevel
627   , pOpPriority
628   , pDependencies
629   , pComment
630   ])
631
632 -- | Default common parameter values.
633 defOpParams :: CommonOpParams
634 defOpParams =
635   CommonOpParams { opDryRun     = Nothing
636                  , opDebugLevel = Nothing
637                  , opPriority   = OpPrioNormal
638                  , opDepends    = Nothing
639                  , opComment    = Nothing
640                  }
641
642 -- | The top-level opcode type.
643 data MetaOpCode = MetaOpCode { metaParams :: CommonOpParams
644                              , metaOpCode :: OpCode
645                              } deriving (Show, Eq)
646
647 -- | JSON serialisation for 'MetaOpCode'.
648 showMeta :: MetaOpCode -> JSValue
649 showMeta (MetaOpCode params op) =
650   let objparams = toDictCommonOpParams params
651       objop = toDictOpCode op
652   in makeObj (objparams ++ objop)
653
654 -- | JSON deserialisation for 'MetaOpCode'
655 readMeta :: JSValue -> Text.JSON.Result MetaOpCode
656 readMeta v = do
657   meta <- readJSON v
658   op <- readJSON v
659   return $ MetaOpCode meta op
660
661 instance JSON MetaOpCode where
662   showJSON = showMeta
663   readJSON = readMeta
664
665 -- | Wraps an 'OpCode' with the default parameters to build a
666 -- 'MetaOpCode'.
667 wrapOpCode :: OpCode -> MetaOpCode
668 wrapOpCode = MetaOpCode defOpParams
669
670 -- | Sets the comment on a meta opcode.
671 setOpComment :: String -> MetaOpCode -> MetaOpCode
672 setOpComment comment (MetaOpCode common op) =
673   MetaOpCode (common { opComment = Just comment}) op
674
675 -- | Sets the priority on a meta opcode.
676 setOpPriority :: OpSubmitPriority -> MetaOpCode -> MetaOpCode
677 setOpPriority prio (MetaOpCode common op) =
678   MetaOpCode (common { opPriority = prio }) op