Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / OpCodes.hs @ 68af861c

History | View | Annotate | Download (17.2 kB)

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

    
574
-- | Returns the OP_ID for a given opcode value.
575
$(genOpID ''OpCode "opID")
576

    
577
-- | A list of all defined/supported opcode IDs.
578
$(genAllOpIDs ''OpCode "allOpIDs")
579

    
580
instance JSON OpCode where
581
  readJSON = loadOpCode
582
  showJSON = saveOpCode
583

    
584
-- | Generates the summary value for an opcode.
585
opSummaryVal :: OpCode -> Maybe String
586
opSummaryVal OpClusterVerifyGroup { opGroupName = s } = Just (fromNonEmpty s)
587
opSummaryVal OpGroupVerifyDisks { opGroupName = s } = Just (fromNonEmpty s)
588
opSummaryVal OpClusterRename { opName = s } = Just (fromNonEmpty s)
589
opSummaryVal OpQuery { opWhat = s } = Just (queryTypeOpToRaw s)
590
opSummaryVal OpQueryFields { opWhat = s } = Just (queryTypeOpToRaw s)
591
opSummaryVal OpNodeRemove { opNodeName = s } = Just (fromNonEmpty s)
592
opSummaryVal OpNodeAdd { opNodeName = s } = Just (fromNonEmpty s)
593
opSummaryVal OpNodeModifyStorage { opNodeName = s } = Just (fromNonEmpty s)
594
opSummaryVal OpRepairNodeStorage  { opNodeName = s } = Just (fromNonEmpty s)
595
opSummaryVal OpNodeSetParams { opNodeName = s } = Just (fromNonEmpty s)
596
opSummaryVal OpNodePowercycle { opNodeName = s } = Just (fromNonEmpty s)
597
opSummaryVal OpNodeMigrate { opNodeName = s } = Just (fromNonEmpty s)
598
opSummaryVal OpNodeEvacuate { opNodeName = s } = Just (fromNonEmpty s)
599
opSummaryVal OpInstanceCreate { opInstanceName = s } = Just s
600
opSummaryVal OpInstanceReinstall { opInstanceName = s } = Just s
601
opSummaryVal OpInstanceRemove { opInstanceName = s } = Just s
602
-- FIXME: instance rename should show both names; currently it shows none
603
-- opSummaryVal OpInstanceRename { opInstanceName = s } = Just s
604
opSummaryVal OpInstanceStartup { opInstanceName = s } = Just s
605
opSummaryVal OpInstanceShutdown { opInstanceName = s } = Just s
606
opSummaryVal OpInstanceReboot { opInstanceName = s } = Just s
607
opSummaryVal OpInstanceReplaceDisks { opInstanceName = s } = Just s
608
opSummaryVal OpInstanceFailover { opInstanceName = s } = Just s
609
opSummaryVal OpInstanceMigrate { opInstanceName = s } = Just s
610
opSummaryVal OpInstanceMove { opInstanceName = s } = Just s
611
opSummaryVal OpInstanceConsole { opInstanceName = s } = Just s
612
opSummaryVal OpInstanceActivateDisks { opInstanceName = s } = Just s
613
opSummaryVal OpInstanceDeactivateDisks { opInstanceName = s } = Just s
614
opSummaryVal OpInstanceRecreateDisks { opInstanceName = s } = Just s
615
opSummaryVal OpInstanceSetParams { opInstanceName = s } = Just s
616
opSummaryVal OpInstanceGrowDisk { opInstanceName = s } = Just s
617
opSummaryVal OpInstanceChangeGroup { opInstanceName = s } = Just s
618
opSummaryVal OpGroupAdd { opGroupName = s } = Just (fromNonEmpty s)
619
opSummaryVal OpGroupAssignNodes { opGroupName = s } = Just (fromNonEmpty s)
620
opSummaryVal OpGroupSetParams { opGroupName = s } = Just (fromNonEmpty s)
621
opSummaryVal OpGroupRemove { opGroupName = s } = Just (fromNonEmpty s)
622
opSummaryVal OpGroupEvacuate { opGroupName = s } = Just (fromNonEmpty s)
623
opSummaryVal OpBackupPrepare { opInstanceName = s } = Just s
624
opSummaryVal OpBackupExport { opInstanceName = s } = Just s
625
opSummaryVal OpBackupRemove { opInstanceName = s } = Just s
626
opSummaryVal OpTagsGet { opKind = k } =
627
  Just . fromMaybe "None" $ tagNameOf k
628
opSummaryVal OpTagsSearch { opTagSearchPattern = s } = Just (fromNonEmpty s)
629
opSummaryVal OpTestDelay { opDelayDuration = d } = Just (show d)
630
opSummaryVal OpTestAllocator { opIallocator = s } =
631
  -- FIXME: Python doesn't handle None fields well, so we have behave the same
632
  Just $ maybe "None" fromNonEmpty s
633
opSummaryVal OpNetworkAdd { opNetworkName = s} = Just (fromNonEmpty s)
634
opSummaryVal OpNetworkRemove { opNetworkName = s} = Just (fromNonEmpty s)
635
opSummaryVal OpNetworkSetParams { opNetworkName = s} = Just (fromNonEmpty s)
636
opSummaryVal OpNetworkConnect { opNetworkName = s} = Just (fromNonEmpty s)
637
opSummaryVal OpNetworkDisconnect { opNetworkName = s} = Just (fromNonEmpty s)
638
opSummaryVal _ = Nothing
639

    
640
-- | Computes the summary of the opcode.
641
opSummary :: OpCode -> String
642
opSummary op =
643
  case opSummaryVal op of
644
    Nothing -> op_suffix
645
    Just s -> op_suffix ++ "(" ++ s ++ ")"
646
  where op_suffix = drop 3 $ opID op
647

    
648
-- | Generic\/common opcode parameters.
649
$(buildObject "CommonOpParams" "op"
650
  [ pDryRun
651
  , pDebugLevel
652
  , pOpPriority
653
  , pDependencies
654
  , pComment
655
  , pReason
656
  ])
657

    
658
-- | Default common parameter values.
659
defOpParams :: CommonOpParams
660
defOpParams =
661
  CommonOpParams { opDryRun     = Nothing
662
                 , opDebugLevel = Nothing
663
                 , opPriority   = OpPrioNormal
664
                 , opDepends    = Nothing
665
                 , opComment    = Nothing
666
                 , opReason     = []
667
                 }
668

    
669
-- | The top-level opcode type.
670
data MetaOpCode = MetaOpCode { metaParams :: CommonOpParams
671
                             , metaOpCode :: OpCode
672
                             } deriving (Show, Eq)
673

    
674
-- | JSON serialisation for 'MetaOpCode'.
675
showMeta :: MetaOpCode -> JSValue
676
showMeta (MetaOpCode params op) =
677
  let objparams = toDictCommonOpParams params
678
      objop = toDictOpCode op
679
  in makeObj (objparams ++ objop)
680

    
681
-- | JSON deserialisation for 'MetaOpCode'
682
readMeta :: JSValue -> Text.JSON.Result MetaOpCode
683
readMeta v = do
684
  meta <- readJSON v
685
  op <- readJSON v
686
  return $ MetaOpCode meta op
687

    
688
instance JSON MetaOpCode where
689
  showJSON = showMeta
690
  readJSON = readMeta
691

    
692
-- | Wraps an 'OpCode' with the default parameters to build a
693
-- 'MetaOpCode'.
694
wrapOpCode :: OpCode -> MetaOpCode
695
wrapOpCode = MetaOpCode defOpParams
696

    
697
-- | Sets the comment on a meta opcode.
698
setOpComment :: String -> MetaOpCode -> MetaOpCode
699
setOpComment comment (MetaOpCode common op) =
700
  MetaOpCode (common { opComment = Just comment}) op
701

    
702
-- | Sets the priority on a meta opcode.
703
setOpPriority :: OpSubmitPriority -> MetaOpCode -> MetaOpCode
704
setOpPriority prio (MetaOpCode common op) =
705
  MetaOpCode (common { opPriority = prio }) op