Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / OpCodes.hs @ ace37e24

History | View | Annotate | Download (16.4 kB)

1
{-# LANGUAGE TemplateHaskell #-}
2

    
3
{-| Implementation of the opcodes.
4

    
5
-}
6

    
7
{-
8

    
9
Copyright (C) 2009, 2010, 2011, 2012 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
  ) where
48

    
49
import Data.Maybe (fromMaybe)
50
import Text.JSON (readJSON, showJSON, JSON, JSValue, makeObj)
51
import qualified Text.JSON
52

    
53
import Ganeti.THH
54

    
55
import Ganeti.OpParams
56
import Ganeti.Types (OpSubmitPriority(..), fromNonEmpty)
57
import Ganeti.Query.Language (queryTypeOpToRaw)
58

    
59
-- | OpCode representation.
60
--
61
-- We only implement a subset of Ganeti opcodes: those which are actually used
62
-- in the htools codebase.
63
$(genOpCode "OpCode"
64
  [ ("OpTestDelay",
65
     [ pDelayDuration
66
     , pDelayOnMaster
67
     , pDelayOnNodes
68
     , pDelayRepeat
69
     ])
70
  , ("OpInstanceReplaceDisks",
71
     [ pInstanceName
72
     , pEarlyRelease
73
     , pIgnoreIpolicy
74
     , pReplaceDisksMode
75
     , pReplaceDisksList
76
     , pRemoteNode
77
     , pIallocator
78
     ])
79
  , ("OpInstanceFailover",
80
     [ pInstanceName
81
     , pShutdownTimeout
82
     , pIgnoreConsistency
83
     , pMigrationTargetNode
84
     , pIgnoreIpolicy
85
     , pIallocator
86
     ])
87
  , ("OpInstanceMigrate",
88
     [ pInstanceName
89
     , pMigrationMode
90
     , pMigrationLive
91
     , pMigrationTargetNode
92
     , pAllowRuntimeChgs
93
     , pIgnoreIpolicy
94
     , pMigrationCleanup
95
     , pIallocator
96
     , pAllowFailover
97
     ])
98
  , ("OpTagsGet",
99
     [ pTagsObject
100
     , pUseLocking
101
     ])
102
  , ("OpTagsSearch",
103
     [ pTagSearchPattern ])
104
  , ("OpTagsSet",
105
     [ pTagsObject
106
     , pTagsList
107
     ])
108
  , ("OpTagsDel",
109
     [ pTagsObject
110
     , pTagsList
111
     ])
112
  , ("OpClusterPostInit", [])
113
  , ("OpClusterDestroy", [])
114
  , ("OpClusterQuery", [])
115
  , ("OpClusterVerify",
116
     [ pDebugSimulateErrors
117
     , pErrorCodes
118
     , pSkipChecks
119
     , pIgnoreErrors
120
     , pVerbose
121
     , pOptGroupName
122
     ])
123
  , ("OpClusterVerifyConfig",
124
     [ pDebugSimulateErrors
125
     , pErrorCodes
126
     , pIgnoreErrors
127
     , pVerbose
128
     ])
129
  , ("OpClusterVerifyGroup",
130
     [ pGroupName
131
     , pDebugSimulateErrors
132
     , pErrorCodes
133
     , pSkipChecks
134
     , pIgnoreErrors
135
     , pVerbose
136
     ])
137
  , ("OpClusterVerifyDisks", [])
138
  , ("OpGroupVerifyDisks",
139
     [ pGroupName
140
     ])
141
  , ("OpClusterRepairDiskSizes",
142
     [ pInstances
143
     ])
144
  , ("OpClusterConfigQuery",
145
     [ pOutputFields
146
     ])
147
  , ("OpClusterRename",
148
     [ pName
149
     ])
150
  , ("OpClusterSetParams",
151
     [ pHvState
152
     , pDiskState
153
     , pVgName
154
     , pEnabledHypervisors
155
     , pClusterHvParams
156
     , pClusterBeParams
157
     , pOsHvp
158
     , pClusterOsParams
159
     , pDiskParams
160
     , pCandidatePoolSize
161
     , pUidPool
162
     , pAddUids
163
     , pRemoveUids
164
     , pMaintainNodeHealth
165
     , pPreallocWipeDisks
166
     , pNicParams
167
     , pNdParams
168
     , pIpolicy
169
     , pDrbdHelper
170
     , pDefaultIAllocator
171
     , pMasterNetdev
172
     , pMasterNetmask
173
     , pReservedLvs
174
     , pHiddenOs
175
     , pBlacklistedOs
176
     , pUseExternalMipScript
177
     ])
178
  , ("OpClusterRedistConf", [])
179
  , ("OpClusterActivateMasterIp", [])
180
  , ("OpClusterDeactivateMasterIp", [])
181
  , ("OpQuery",
182
     [ pQueryWhat
183
     , pUseLocking
184
     , pQueryFields
185
     , pQueryFilter
186
     ])
187
  , ("OpQueryFields",
188
     [ pQueryWhat
189
     , pQueryFields
190
     ])
191
  , ("OpOobCommand",
192
     [ pNodeNames
193
     , pOobCommand
194
     , pOobTimeout
195
     , pIgnoreStatus
196
     , pPowerDelay
197
     ])
198
  , ("OpNodeRemove", [ pNodeName ])
199
  , ("OpNodeAdd",
200
     [ pNodeName
201
     , pHvState
202
     , pDiskState
203
     , pPrimaryIp
204
     , pSecondaryIp
205
     , pReadd
206
     , pNodeGroup
207
     , pMasterCapable
208
     , pVmCapable
209
     , pNdParams
210
    ])
211
  , ("OpNodeQuery", dOldQuery)
212
  , ("OpNodeQueryvols",
213
     [ pOutputFields
214
     , pNodes
215
     ])
216
  , ("OpNodeQueryStorage",
217
     [ pOutputFields
218
     , pStorageType
219
     , pNodes
220
     , pStorageName
221
     ])
222
  , ("OpNodeModifyStorage",
223
     [ pNodeName
224
     , pStorageType
225
     , pStorageName
226
     , pStorageChanges
227
     ])
228
  , ("OpRepairNodeStorage",
229
     [ pNodeName
230
     , pStorageType
231
     , pStorageName
232
     , pIgnoreConsistency
233
     ])
234
  , ("OpNodeSetParams",
235
     [ pNodeName
236
     , pForce
237
     , pHvState
238
     , pDiskState
239
     , pMasterCandidate
240
     , pOffline
241
     , pDrained
242
     , pAutoPromote
243
     , pMasterCapable
244
     , pVmCapable
245
     , pSecondaryIp
246
     , pNdParams
247
     , pPowered
248
     ])
249
  , ("OpNodePowercycle",
250
     [ pNodeName
251
     , pForce
252
     ])
253
  , ("OpNodeMigrate",
254
     [ pNodeName
255
     , pMigrationMode
256
     , pMigrationLive
257
     , pMigrationTargetNode
258
     , pAllowRuntimeChgs
259
     , pIgnoreIpolicy
260
     , pIallocator
261
     ])
262
  , ("OpNodeEvacuate",
263
     [ pEarlyRelease
264
     , pNodeName
265
     , pRemoteNode
266
     , pIallocator
267
     , pEvacMode
268
     ])
269
  , ("OpInstanceCreate",
270
     [ pInstanceName
271
     , pForceVariant
272
     , pWaitForSync
273
     , pNameCheck
274
     , pIgnoreIpolicy
275
     , pInstBeParams
276
     , pInstDisks
277
     , pDiskTemplate
278
     , pFileDriver
279
     , pFileStorageDir
280
     , pInstHvParams
281
     , pHypervisor
282
     , pIallocator
283
     , pResetDefaults
284
     , pIpCheck
285
     , pIpConflictsCheck
286
     , pInstCreateMode
287
     , pInstNics
288
     , pNoInstall
289
     , pInstOsParams
290
     , pInstOs
291
     , pPrimaryNode
292
     , pSecondaryNode
293
     , pSourceHandshake
294
     , pSourceInstance
295
     , pSourceShutdownTimeout
296
     , pSourceX509Ca
297
     , pSrcNode
298
     , pSrcPath
299
     , pStartInstance
300
     , pOpportunisticLocking
301
     , pInstTags
302
     ])
303
  , ("OpInstanceMultiAlloc",
304
     [ pIallocator
305
     , pMultiAllocInstances
306
     , pOpportunisticLocking
307
     ])
308
  , ("OpInstanceReinstall",
309
     [ pInstanceName
310
     , pForceVariant
311
     , pInstOs
312
     , pTempOsParams
313
     ])
314
  , ("OpInstanceRemove",
315
     [ pInstanceName
316
     , pShutdownTimeout
317
     , pIgnoreFailures
318
     ])
319
  , ("OpInstanceRename",
320
     [ pInstanceName
321
     , pNewName
322
     , pNameCheck
323
     , pIpCheck
324
     ])
325
  , ("OpInstanceStartup",
326
     [ pInstanceName
327
     , pForce
328
     , pIgnoreOfflineNodes
329
     , pTempHvParams
330
     , pTempBeParams
331
     , pNoRemember
332
     , pStartupPaused
333
     ])
334
  , ("OpInstanceShutdown",
335
     [ pInstanceName
336
     , pForce
337
     , pIgnoreOfflineNodes
338
     , pShutdownTimeout'
339
     , pNoRemember
340
     ])
341
  , ("OpInstanceReboot",
342
     [ pInstanceName
343
     , pShutdownTimeout
344
     , pIgnoreSecondaries
345
     , pRebootType
346
     ])
347
  , ("OpInstanceMove",
348
     [ pInstanceName
349
     , pShutdownTimeout
350
     , pIgnoreIpolicy
351
     , pMoveTargetNode
352
     , pIgnoreConsistency
353
     ])
354
  , ("OpInstanceConsole",
355
     [ pInstanceName ])
356
  , ("OpInstanceActivateDisks",
357
     [ pInstanceName
358
     , pIgnoreDiskSize
359
     , pWaitForSyncFalse
360
     ])
361
  , ("OpInstanceDeactivateDisks",
362
     [ pInstanceName
363
     , pForce
364
     ])
365
  , ("OpInstanceRecreateDisks",
366
     [ pInstanceName
367
     , pRecreateDisksInfo
368
     , pNodes
369
     , pIallocator
370
     ])
371
  , ("OpInstanceQuery", dOldQuery)
372
  , ("OpInstanceQueryData",
373
     [ pUseLocking
374
     , pInstances
375
     , pStatic
376
     ])
377
  , ("OpInstanceSetParams",
378
     [ pInstanceName
379
     , pForce
380
     , pForceVariant
381
     , pIgnoreIpolicy
382
     , pInstParamsNicChanges
383
     , pInstParamsDiskChanges
384
     , pInstBeParams
385
     , pRuntimeMem
386
     , pInstHvParams
387
     , pOptDiskTemplate
388
     , pRemoteNode
389
     , pOsNameChange
390
     , pInstOsParams
391
     , pWaitForSync
392
     , pOffline
393
     , pIpConflictsCheck
394
     ])
395
  , ("OpInstanceGrowDisk",
396
     [ pInstanceName
397
     , pWaitForSync
398
     , pDiskIndex
399
     , pDiskChgAmount
400
     , pDiskChgAbsolute
401
     ])
402
  , ("OpInstanceChangeGroup",
403
     [ pInstanceName
404
     , pEarlyRelease
405
     , pIallocator
406
     , pTargetGroups
407
     ])
408
  , ("OpGroupAdd",
409
     [ pGroupName
410
     , pNodeGroupAllocPolicy
411
     , pGroupNodeParams
412
     , pDiskParams
413
     , pHvState
414
     , pDiskState
415
     , pIpolicy
416
     ])
417
  , ("OpGroupAssignNodes",
418
     [ pGroupName
419
     , pForce
420
     , pRequiredNodes
421
     ])
422
  , ("OpGroupQuery", dOldQueryNoLocking)
423
  , ("OpGroupSetParams",
424
     [ pGroupName
425
     , pNodeGroupAllocPolicy
426
     , pGroupNodeParams
427
     , pDiskParams
428
     , pHvState
429
     , pDiskState
430
     , pIpolicy
431
     ])
432
  , ("OpGroupRemove",
433
     [ pGroupName ])
434
  , ("OpGroupRename",
435
     [ pGroupName
436
     , pNewName
437
     ])
438
  , ("OpGroupEvacuate",
439
     [ pGroupName
440
     , pEarlyRelease
441
     , pIallocator
442
     , pTargetGroups
443
     ])
444
  , ("OpOsDiagnose",
445
     [ pOutputFields
446
     , pNames ])
447
  , ("OpExtStorageDiagnose",
448
     [ pOutputFields
449
     , pNames ])
450
  , ("OpBackupQuery",
451
     [ pUseLocking
452
     , pNodes
453
     ])
454
  , ("OpBackupPrepare",
455
     [ pInstanceName
456
     , pExportMode
457
     ])
458
  , ("OpBackupExport",
459
     [ pInstanceName
460
     , pShutdownTimeout
461
     , pExportTargetNode
462
     , pShutdownInstance
463
     , pRemoveInstance
464
     , pIgnoreRemoveFailures
465
     , pExportMode
466
     , pX509KeyName
467
     , pX509DestCA
468
     ])
469
  , ("OpBackupRemove",
470
     [ pInstanceName ])
471
  , ("OpTestAllocator",
472
     [ pIAllocatorDirection
473
     , pIAllocatorMode
474
     , pIAllocatorReqName
475
     , pIAllocatorNics
476
     , pIAllocatorDisks
477
     , pHypervisor
478
     , pIallocator
479
     , pInstTags
480
     , pIAllocatorMemory
481
     , pIAllocatorVCpus
482
     , pIAllocatorOs
483
     , pDiskTemplate
484
     , pIAllocatorInstances
485
     , pIAllocatorEvacMode
486
     , pTargetGroups
487
     , pIAllocatorSpindleUse
488
     , pIAllocatorCount
489
     ])
490
  , ("OpTestJqueue",
491
     [ pJQueueNotifyWaitLock
492
     , pJQueueNotifyExec
493
     , pJQueueLogMessages
494
     , pJQueueFail
495
     ])
496
  , ("OpTestDummy",
497
     [ pTestDummyResult
498
     , pTestDummyMessages
499
     , pTestDummyFail
500
     , pTestDummySubmitJobs
501
     ])
502
  , ("OpNetworkAdd",
503
     [ pNetworkName
504
     , pNetworkType
505
     , pNetworkAddress4
506
     , pNetworkGateway4
507
     , pNetworkAddress6
508
     , pNetworkGateway6
509
     , pNetworkMacPrefix
510
     , pNetworkAddRsvdIps
511
     , pIpConflictsCheck
512
     , pInstTags
513
     ])
514
  , ("OpNetworkRemove",
515
     [ pNetworkName
516
     , pForce
517
     ])
518
  , ("OpNetworkSetParams",
519
     [ pNetworkName
520
     , pNetworkType
521
     , pNetworkGateway4
522
     , pNetworkAddress6
523
     , pNetworkGateway6
524
     , pNetworkMacPrefix
525
     , pNetworkAddRsvdIps
526
     , pNetworkRemoveRsvdIps
527
     ])
528
  , ("OpNetworkConnect",
529
     [ pGroupName
530
     , pNetworkName
531
     , pNetworkMode
532
     , pNetworkLink
533
     , pIpConflictsCheck
534
     ])
535
  , ("OpNetworkDisconnect",
536
     [ pGroupName
537
     , pNetworkName
538
     , pIpConflictsCheck
539
     ])
540
  , ("OpNetworkQuery", dOldQuery)
541
  , ("OpRestrictedCommand",
542
     [ pUseLocking
543
     , pRequiredNodes
544
     , pRestrictedCommand
545
     ])
546
  ])
547

    
548
-- | Returns the OP_ID for a given opcode value.
549
$(genOpID ''OpCode "opID")
550

    
551
-- | A list of all defined/supported opcode IDs.
552
$(genAllOpIDs ''OpCode "allOpIDs")
553

    
554
instance JSON OpCode where
555
  readJSON = loadOpCode
556
  showJSON = saveOpCode
557

    
558
-- | Generates the summary value for an opcode.
559
opSummaryVal :: OpCode -> Maybe String
560
opSummaryVal OpClusterVerifyGroup { opGroupName = s } = Just (fromNonEmpty s)
561
opSummaryVal OpGroupVerifyDisks { opGroupName = s } = Just (fromNonEmpty s)
562
opSummaryVal OpClusterRename { opName = s } = Just (fromNonEmpty s)
563
opSummaryVal OpQuery { opWhat = s } = Just (queryTypeOpToRaw s)
564
opSummaryVal OpQueryFields { opWhat = s } = Just (queryTypeOpToRaw s)
565
opSummaryVal OpNodeRemove { opNodeName = s } = Just (fromNonEmpty s)
566
opSummaryVal OpNodeAdd { opNodeName = s } = Just (fromNonEmpty s)
567
opSummaryVal OpNodeModifyStorage { opNodeName = s } = Just (fromNonEmpty s)
568
opSummaryVal OpRepairNodeStorage  { opNodeName = s } = Just (fromNonEmpty s)
569
opSummaryVal OpNodeSetParams { opNodeName = s } = Just (fromNonEmpty s)
570
opSummaryVal OpNodePowercycle { opNodeName = s } = Just (fromNonEmpty s)
571
opSummaryVal OpNodeMigrate { opNodeName = s } = Just (fromNonEmpty s)
572
opSummaryVal OpNodeEvacuate { opNodeName = s } = Just (fromNonEmpty s)
573
opSummaryVal OpInstanceCreate { opInstanceName = s } = Just s
574
opSummaryVal OpInstanceReinstall { opInstanceName = s } = Just s
575
opSummaryVal OpInstanceRemove { opInstanceName = s } = Just s
576
-- FIXME: instance rename should show both names; currently it shows none
577
-- opSummaryVal OpInstanceRename { opInstanceName = s } = Just s
578
opSummaryVal OpInstanceStartup { opInstanceName = s } = Just s
579
opSummaryVal OpInstanceShutdown { opInstanceName = s } = Just s
580
opSummaryVal OpInstanceReboot { opInstanceName = s } = Just s
581
opSummaryVal OpInstanceReplaceDisks { opInstanceName = s } = Just s
582
opSummaryVal OpInstanceFailover { opInstanceName = s } = Just s
583
opSummaryVal OpInstanceMigrate { opInstanceName = s } = Just s
584
opSummaryVal OpInstanceMove { opInstanceName = s } = Just s
585
opSummaryVal OpInstanceConsole { opInstanceName = s } = Just s
586
opSummaryVal OpInstanceActivateDisks { opInstanceName = s } = Just s
587
opSummaryVal OpInstanceDeactivateDisks { opInstanceName = s } = Just s
588
opSummaryVal OpInstanceRecreateDisks { opInstanceName = s } = Just s
589
opSummaryVal OpInstanceSetParams { opInstanceName = s } = Just s
590
opSummaryVal OpInstanceGrowDisk { opInstanceName = s } = Just s
591
opSummaryVal OpInstanceChangeGroup { opInstanceName = s } = Just s
592
opSummaryVal OpGroupAdd { opGroupName = s } = Just (fromNonEmpty s)
593
opSummaryVal OpGroupAssignNodes { opGroupName = s } = Just (fromNonEmpty s)
594
opSummaryVal OpGroupSetParams { opGroupName = s } = Just (fromNonEmpty s)
595
opSummaryVal OpGroupRemove { opGroupName = s } = Just (fromNonEmpty s)
596
opSummaryVal OpGroupEvacuate { opGroupName = s } = Just (fromNonEmpty s)
597
opSummaryVal OpBackupPrepare { opInstanceName = s } = Just s
598
opSummaryVal OpBackupExport { opInstanceName = s } = Just s
599
opSummaryVal OpBackupRemove { opInstanceName = s } = Just s
600
opSummaryVal OpTagsGet { opKind = k } =
601
  Just . fromMaybe "None" $ tagNameOf k
602
opSummaryVal OpTagsSearch { opTagSearchPattern = s } = Just (fromNonEmpty s)
603
opSummaryVal OpTestDelay { opDelayDuration = d } = Just (show d)
604
opSummaryVal OpTestAllocator { opIallocator = s } =
605
  -- FIXME: Python doesn't handle None fields well, so we have behave the same
606
  Just $ maybe "None" fromNonEmpty s
607
opSummaryVal OpNetworkAdd { opNetworkName = s} = Just (fromNonEmpty s)
608
opSummaryVal OpNetworkRemove { opNetworkName = s} = Just (fromNonEmpty s)
609
opSummaryVal OpNetworkSetParams { opNetworkName = s} = Just (fromNonEmpty s)
610
opSummaryVal OpNetworkConnect { opNetworkName = s} = Just (fromNonEmpty s)
611
opSummaryVal OpNetworkDisconnect { opNetworkName = s} = Just (fromNonEmpty s)
612
opSummaryVal _ = Nothing
613

    
614
-- | Computes the summary of the opcode.
615
opSummary :: OpCode -> String
616
opSummary op =
617
  case opSummaryVal op of
618
    Nothing -> op_suffix
619
    Just s -> op_suffix ++ "(" ++ s ++ ")"
620
  where op_suffix = drop 3 $ opID op
621

    
622
-- | Generic\/common opcode parameters.
623
$(buildObject "CommonOpParams" "op"
624
  [ pDryRun
625
  , pDebugLevel
626
  , pOpPriority
627
  , pDependencies
628
  , pComment
629
  ])
630

    
631
-- | Default common parameter values.
632
defOpParams :: CommonOpParams
633
defOpParams =
634
  CommonOpParams { opDryRun     = Nothing
635
                 , opDebugLevel = Nothing
636
                 , opPriority   = OpPrioNormal
637
                 , opDepends    = Nothing
638
                 , opComment    = Nothing
639
                 }
640

    
641
-- | The top-level opcode type.
642
data MetaOpCode = MetaOpCode { metaParams :: CommonOpParams
643
                             , metaOpCode :: OpCode
644
                             } deriving (Show, Eq)
645

    
646
-- | JSON serialisation for 'MetaOpCode'.
647
showMeta :: MetaOpCode -> JSValue
648
showMeta (MetaOpCode params op) =
649
  let objparams = toDictCommonOpParams params
650
      objop = toDictOpCode op
651
  in makeObj (objparams ++ objop)
652

    
653
-- | JSON deserialisation for 'MetaOpCode'
654
readMeta :: JSValue -> Text.JSON.Result MetaOpCode
655
readMeta v = do
656
  meta <- readJSON v
657
  op <- readJSON v
658
  return $ MetaOpCode meta op
659

    
660
instance JSON MetaOpCode where
661
  showJSON = showMeta
662
  readJSON = readMeta
663

    
664
-- | Wraps an 'OpCode' with the default parameters to build a
665
-- 'MetaOpCode'.
666
wrapOpCode :: OpCode -> MetaOpCode
667
wrapOpCode = MetaOpCode defOpParams
668

    
669
-- | Sets the comment on a meta opcode.
670
setOpComment :: String -> MetaOpCode -> MetaOpCode
671
setOpComment comment (MetaOpCode common op) =
672
  MetaOpCode (common { opComment = Just comment}) op