Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / HsConstants.hs @ e8d4d41e

History | View | Annotate | Download (57.1 kB)

1
{-| HsConstants contains the Haskell constants
2

    
3
This is a transitional module complementary to 'Ganeti.Constants'.  It
4
is intended to contain the Haskell constants that are meant to be
5
generated in Python.
6

    
7
Do not write any definitions in this file other than constants.  Do
8
not even write helper functions.  The definitions in this module are
9
automatically stripped to build the Makefile.am target
10
'ListConstants.hs'.  If there are helper functions in this module,
11
they will also be dragged and it will cause compilation to fail.
12
Therefore, all helper functions should go to a separate module and
13
imported.
14

    
15
-}
16

    
17
{-
18

    
19
Copyright (C) 2013 Google Inc.
20

    
21
This program is free software; you can redistribute it and/or modify
22
it under the terms of the GNU General Public License as published by
23
the Free Software Foundation; either version 2 of the License, or
24
(at your option) any later version.
25

    
26
This program is distributed in the hope that it will be useful, but
27
WITHOUT ANY WARRANTY; without even the implied warranty of
28
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29
General Public License for more details.
30

    
31
You should have received a copy of the GNU General Public License
32
along with this program; if not, write to the Free Software
33
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
34
02110-1301, USA.
35

    
36
-}
37
module Ganeti.HsConstants where
38

    
39
import Control.Arrow ((***))
40
import Data.List ((\\))
41
import Data.Map (Map)
42
import qualified Data.Map as Map (fromList, keys, insert)
43

    
44
import AutoConf
45
import Ganeti.ConstantUtils (PythonChar(..), FrozenSet, Protocol(..),
46
                             buildVersion)
47
import qualified Ganeti.ConstantUtils as ConstantUtils
48
import Ganeti.Runtime (GanetiDaemon(..), MiscGroup(..), GanetiGroup(..),
49
                       ExtraLogReason(..))
50
import Ganeti.HTools.Types (AutoRepairResult(..), AutoRepairType(..))
51
import qualified Ganeti.HTools.Types as Types
52
import Ganeti.Logging (SyslogUsage(..))
53
import qualified Ganeti.Logging as Logging (syslogUsageToRaw)
54
import qualified Ganeti.Runtime as Runtime
55
import Ganeti.Types
56
import qualified Ganeti.Types as Types
57
import Ganeti.Confd.Types (ConfdRequestType(..), ConfdReqField(..),
58
                           ConfdReplyStatus(..), ConfdNodeRole(..),
59
                           ConfdErrorType(..))
60
import qualified Ganeti.Confd.Types as Types
61

    
62
{-# ANN module "HLint: ignore Use camelCase" #-}
63

    
64
-- * 'autoconf' constants for Python only ('autotools/build-bash-completion')
65

    
66
htoolsProgs :: [String]
67
htoolsProgs = AutoConf.htoolsProgs
68

    
69
-- * 'autoconf' constants for Python only ('lib/constants.py')
70

    
71
drbdBarriers :: String
72
drbdBarriers = AutoConf.drbdBarriers
73

    
74
drbdNoMetaFlush :: Bool
75
drbdNoMetaFlush = AutoConf.drbdNoMetaFlush
76

    
77
lvmStripecount :: Int
78
lvmStripecount = AutoConf.lvmStripecount
79

    
80
-- * 'autoconf' constants for Python only ('lib/pathutils.py')
81

    
82
-- ** Build-time constants
83

    
84
exportDir :: String
85
exportDir = AutoConf.exportDir
86

    
87
osSearchPath :: [String]
88
osSearchPath = AutoConf.osSearchPath
89

    
90
esSearchPath :: [String]
91
esSearchPath = AutoConf.esSearchPath
92

    
93
sshConfigDir :: String
94
sshConfigDir = AutoConf.sshConfigDir
95

    
96
xenConfigDir :: String
97
xenConfigDir = AutoConf.xenConfigDir
98

    
99
sysconfdir :: String
100
sysconfdir = AutoConf.sysconfdir
101

    
102
toolsdir :: String
103
toolsdir = AutoConf.toolsdir
104

    
105
localstatedir :: String
106
localstatedir = AutoConf.localstatedir
107

    
108
-- ** Paths which don't change for a virtual cluster
109

    
110
pkglibdir :: String
111
pkglibdir = AutoConf.pkglibdir
112

    
113
sharedir :: String
114
sharedir = AutoConf.sharedir
115

    
116
-- * 'autoconf' constants for Python only ('lib/build/sphinx_ext.py')
117

    
118
manPages :: Map String Int
119
manPages = Map.fromList AutoConf.manPages
120

    
121
-- * 'autoconf' constants for QA cluster only ('qa/qa_cluster.py')
122

    
123
versionedsharedir :: String
124
versionedsharedir = AutoConf.versionedsharedir
125

    
126
-- * 'autoconf' constants for Python only ('tests/py/docs_unittest.py')
127

    
128
gntScripts :: [String]
129
gntScripts = AutoConf.gntScripts
130

    
131
-- * Various versions
132

    
133
releaseVersion :: String
134
releaseVersion = AutoConf.packageVersion
135

    
136
versionMajor :: Int
137
versionMajor = AutoConf.versionMajor
138

    
139
versionMinor :: Int
140
versionMinor = AutoConf.versionMinor
141

    
142
versionRevision :: Int
143
versionRevision = AutoConf.versionRevision
144

    
145
dirVersion :: String
146
dirVersion = AutoConf.dirVersion
147

    
148
osApiV10 :: Int
149
osApiV10 = 10
150

    
151
osApiV15 :: Int
152
osApiV15 = 15
153

    
154
osApiV20 :: Int
155
osApiV20 = 20
156

    
157
osApiVersions :: FrozenSet Int
158
osApiVersions = ConstantUtils.mkSet [osApiV10, osApiV15, osApiV20]
159

    
160
exportVersion :: Int
161
exportVersion = 0
162

    
163
rapiVersion :: Int
164
rapiVersion = 2
165

    
166
configMajor :: Int
167
configMajor = AutoConf.versionMajor
168

    
169
configMinor :: Int
170
configMinor = AutoConf.versionMinor
171

    
172
-- | The configuration is supposed to remain stable across
173
-- revisions. Therefore, the revision number is cleared to '0'.
174
configRevision :: Int
175
configRevision = 0
176

    
177
configVersion :: Int
178
configVersion = buildVersion configMajor configMinor configRevision
179

    
180
-- | Similarly to the configuration (see 'configRevision'), the
181
-- protocols are supposed to remain stable across revisions.
182
protocolVersion :: Int
183
protocolVersion = buildVersion configMajor configMinor configRevision
184

    
185
-- * User separation
186

    
187
daemonsGroup :: String
188
daemonsGroup = Runtime.daemonGroup (ExtraGroup DaemonsGroup)
189

    
190
adminGroup :: String
191
adminGroup = Runtime.daemonGroup (ExtraGroup AdminGroup)
192

    
193
masterdUser :: String
194
masterdUser = Runtime.daemonUser GanetiMasterd
195

    
196
masterdGroup :: String
197
masterdGroup = Runtime.daemonGroup (DaemonGroup GanetiMasterd)
198

    
199
rapiUser :: String
200
rapiUser = Runtime.daemonUser GanetiRapi
201

    
202
rapiGroup :: String
203
rapiGroup = Runtime.daemonGroup (DaemonGroup GanetiRapi)
204

    
205
confdUser :: String
206
confdUser = Runtime.daemonUser GanetiConfd
207

    
208
confdGroup :: String
209
confdGroup = Runtime.daemonGroup (DaemonGroup GanetiConfd)
210

    
211
luxidUser :: String
212
luxidUser = Runtime.daemonUser GanetiLuxid
213

    
214
luxidGroup :: String
215
luxidGroup = Runtime.daemonGroup (DaemonGroup GanetiLuxid)
216

    
217
nodedUser :: String
218
nodedUser = Runtime.daemonUser GanetiNoded
219

    
220
nodedGroup :: String
221
nodedGroup = Runtime.daemonGroup (DaemonGroup GanetiNoded)
222

    
223
mondUser :: String
224
mondUser = Runtime.daemonUser GanetiMond
225

    
226
mondGroup :: String
227
mondGroup = Runtime.daemonGroup (DaemonGroup GanetiMond)
228

    
229
sshLoginUser :: String
230
sshLoginUser = AutoConf.sshLoginUser
231

    
232
sshConsoleUser :: String
233
sshConsoleUser = AutoConf.sshConsoleUser
234

    
235
-- * Cpu pinning separators and constants
236

    
237
cpuPinningSep :: String
238
cpuPinningSep = ":"
239

    
240
cpuPinningAll :: String
241
cpuPinningAll = "all"
242

    
243
-- | Internal representation of "all"
244
cpuPinningAllVal :: Int
245
cpuPinningAllVal = -1
246

    
247
-- | One "all" entry in a CPU list means CPU pinning is off
248
cpuPinningOff :: [Int]
249
cpuPinningOff = [cpuPinningAllVal]
250

    
251
-- | A Xen-specific implementation detail is that there is no way to
252
-- actually say "use any cpu for pinning" in a Xen configuration file,
253
-- as opposed to the command line, where you can say
254
-- @
255
-- xm vcpu-pin <domain> <vcpu> all
256
-- @
257
--
258
-- The workaround used in Xen is "0-63" (see source code function
259
-- "xm_vcpu_pin" in @<xen-source>/tools/python/xen/xm/main.py@).
260
--
261
-- To support future changes, the following constant is treated as a
262
-- blackbox string that simply means "use any cpu for pinning under
263
-- xen".
264
cpuPinningAllXen :: String
265
cpuPinningAllXen = "0-63"
266

    
267
-- | A KVM-specific implementation detail - the following value is
268
-- used to set CPU affinity to all processors (--0 through --31), per
269
-- taskset man page.
270
--
271
-- FIXME: This only works for machines with up to 32 CPU cores
272
cpuPinningAllKvm :: Int
273
cpuPinningAllKvm = 0xFFFFFFFF
274

    
275
-- * Wipe
276

    
277
ddCmd :: String
278
ddCmd = "dd"
279

    
280
-- | 1GB
281
maxWipeChunk :: Int
282
maxWipeChunk = 1024
283

    
284
minWipeChunkPercent :: Int
285
minWipeChunkPercent = 10
286

    
287
-- * Directories
288

    
289
runDirsMode :: Int
290
runDirsMode = 0o775
291

    
292
secureDirMode :: Int
293
secureDirMode = 0o700
294

    
295
secureFileMode :: Int
296
secureFileMode = 0o600
297

    
298
adoptableBlockdevRoot :: String
299
adoptableBlockdevRoot = "/dev/disk/"
300

    
301
-- * 'autoconf' enable/disable
302

    
303
enableConfd :: Bool
304
enableConfd = AutoConf.enableConfd
305

    
306
enableMond :: Bool
307
enableMond = AutoConf.enableMond
308

    
309
enableRestrictedCommands :: Bool
310
enableRestrictedCommands = AutoConf.enableRestrictedCommands
311

    
312
enableSplitQuery :: Bool
313
enableSplitQuery = AutoConf.enableSplitQuery
314

    
315
-- * SSH constants
316

    
317
ssh :: String
318
ssh = "ssh"
319

    
320
scp :: String
321
scp = "scp"
322

    
323
-- * Daemons
324

    
325
confd :: String
326
confd = Runtime.daemonName GanetiConfd
327

    
328
masterd :: String
329
masterd = Runtime.daemonName GanetiMasterd
330

    
331
mond :: String
332
mond = Runtime.daemonName GanetiMond
333

    
334
noded :: String
335
noded = Runtime.daemonName GanetiNoded
336

    
337
luxid :: String
338
luxid = Runtime.daemonName GanetiLuxid
339

    
340
rapi :: String
341
rapi = Runtime.daemonName GanetiRapi
342

    
343
daemons :: FrozenSet String
344
daemons =
345
  ConstantUtils.mkSet [confd,
346
                       luxid,
347
                       masterd,
348
                       mond,
349
                       noded,
350
                       rapi]
351

    
352
defaultConfdPort :: Int
353
defaultConfdPort = 1814
354

    
355
defaultMondPort :: Int
356
defaultMondPort = 1815
357

    
358
defaultNodedPort :: Int
359
defaultNodedPort = 1811
360

    
361
defaultRapiPort :: Int
362
defaultRapiPort = 5080
363

    
364
daemonsPorts :: Map String (Protocol, Int)
365
daemonsPorts =
366
  Map.fromList [(confd, (Udp, defaultConfdPort)),
367
                (mond, (Tcp, defaultMondPort)),
368
                (noded, (Tcp, defaultNodedPort)),
369
                (rapi, (Tcp, defaultRapiPort)),
370
                (ssh, (Tcp, 22))]
371

    
372
firstDrbdPort :: Int
373
firstDrbdPort = 11000
374

    
375
lastDrbdPort :: Int
376
lastDrbdPort = 14999
377

    
378
daemonsLogbase :: Map String String
379
daemonsLogbase =
380
  Map.fromList
381
  [ (Runtime.daemonName d, Runtime.daemonLogBase d) | d <- [minBound..] ]
382

    
383
extraLogreasonAccess :: String
384
extraLogreasonAccess = Runtime.daemonsExtraLogbase GanetiMond AccessLog
385

    
386
extraLogreasonError :: String
387
extraLogreasonError = Runtime.daemonsExtraLogbase GanetiMond ErrorLog
388

    
389
devConsole :: String
390
devConsole = ConstantUtils.devConsole
391

    
392
procMounts :: String
393
procMounts = "/proc/mounts"
394

    
395
-- * Luxi (Local UniX Interface) related constants
396

    
397
luxiEom :: PythonChar
398
luxiEom = PythonChar '\x03'
399

    
400
-- | Environment variable for the luxi override socket
401
luxiOverride :: String
402
luxiOverride = "FORCE_LUXI_SOCKET"
403

    
404
luxiOverrideMaster :: String
405
luxiOverrideMaster = "master"
406

    
407
luxiOverrideQuery :: String
408
luxiOverrideQuery = "query"
409

    
410
luxiVersion :: Int
411
luxiVersion = configVersion
412

    
413
-- * Syslog
414

    
415
syslogUsage :: String
416
syslogUsage = AutoConf.syslogUsage
417

    
418
syslogNo :: String
419
syslogNo = Logging.syslogUsageToRaw SyslogNo
420

    
421
syslogYes :: String
422
syslogYes = Logging.syslogUsageToRaw SyslogYes
423

    
424
syslogOnly :: String
425
syslogOnly = Logging.syslogUsageToRaw SyslogOnly
426

    
427
syslogSocket :: String
428
syslogSocket = "/dev/log"
429

    
430
exportConfFile :: String
431
exportConfFile = "config.ini"
432

    
433
-- * Xen
434

    
435
xenBootloader :: String
436
xenBootloader = AutoConf.xenBootloader
437

    
438
xenCmdXl :: String
439
xenCmdXl = "xl"
440

    
441
xenCmdXm :: String
442
xenCmdXm = "xm"
443

    
444
xenInitrd :: String
445
xenInitrd = AutoConf.xenInitrd
446

    
447
xenKernel :: String
448
xenKernel = AutoConf.xenKernel
449

    
450
-- FIXME: perhaps rename to 'validXenCommands' for consistency with
451
-- other constants
452
knownXenCommands :: FrozenSet String
453
knownXenCommands = ConstantUtils.mkSet [xenCmdXl, xenCmdXm]
454

    
455
-- * KVM and socat
456

    
457
kvmPath :: String
458
kvmPath = AutoConf.kvmPath
459

    
460
kvmKernel :: String
461
kvmKernel = AutoConf.kvmKernel
462

    
463
socatEscapeCode :: String
464
socatEscapeCode = "0x1d"
465

    
466
socatPath :: String
467
socatPath = AutoConf.socatPath
468

    
469
socatUseCompress :: Bool
470
socatUseCompress = AutoConf.socatUseCompress
471

    
472
socatUseEscape :: Bool
473
socatUseEscape = AutoConf.socatUseEscape
474

    
475
-- * Console types
476

    
477
-- | Display a message for console access
478
consMessage :: String
479
consMessage = "msg"
480

    
481
-- | Console as SPICE server
482
consSpice :: String
483
consSpice = "spice"
484

    
485
-- | Console as SSH command
486
consSsh :: String
487
consSsh = "ssh"
488

    
489
-- | Console as VNC server
490
consVnc :: String
491
consVnc = "vnc"
492

    
493
consAll :: FrozenSet String
494
consAll = ConstantUtils.mkSet [consMessage, consSpice, consSsh, consVnc]
495

    
496
-- | RSA key bit length
497
--
498
-- For RSA keys more bits are better, but they also make operations
499
-- more expensive. NIST SP 800-131 recommends a minimum of 2048 bits
500
-- from the year 2010 on.
501
rsaKeyBits :: Int
502
rsaKeyBits = 2048
503

    
504
-- | Ciphers allowed for SSL connections.
505
--
506
-- For the format, see ciphers(1). A better way to disable ciphers
507
-- would be to use the exclamation mark (!), but socat versions below
508
-- 1.5 can't parse exclamation marks in options properly. When
509
-- modifying the ciphers, ensure not to accidentially add something
510
-- after it's been removed. Use the "openssl" utility to check the
511
-- allowed ciphers, e.g.  "openssl ciphers -v HIGH:-DES".
512
opensslCiphers :: String
513
opensslCiphers = "HIGH:-DES:-3DES:-EXPORT:-ADH"
514

    
515
-- * X509
516

    
517
-- | commonName (CN) used in certificates
518
x509CertCn :: String
519
x509CertCn = "ganeti.example.com"
520

    
521
-- | Default validity of certificates in days
522
x509CertDefaultValidity :: Int
523
x509CertDefaultValidity = 365 * 5
524

    
525
x509CertSignatureHeader :: String
526
x509CertSignatureHeader = "X-Ganeti-Signature"
527

    
528
-- | Digest used to sign certificates ("openssl x509" uses SHA1 by default)
529
x509CertSignDigest :: String
530
x509CertSignDigest = "SHA1"
531

    
532
-- * Import/export daemon mode
533

    
534
iemExport :: String
535
iemExport = "export"
536

    
537
iemImport :: String
538
iemImport = "import"
539

    
540
-- * Import/export transport compression
541

    
542
iecGzip :: String
543
iecGzip = "gzip"
544

    
545
iecNone :: String
546
iecNone = "none"
547

    
548
iecAll :: [String]
549
iecAll = [iecGzip, iecNone]
550

    
551
ieCustomSize :: String
552
ieCustomSize = "fd"
553

    
554
-- * Import/export I/O
555

    
556
-- | Direct file I/O, equivalent to a shell's I/O redirection using
557
-- '<' or '>'
558
ieioFile :: String
559
ieioFile = "file"
560

    
561
-- | Raw block device I/O using "dd"
562
ieioRawDisk :: String
563
ieioRawDisk = "raw"
564

    
565
-- | OS definition import/export script
566
ieioScript :: String
567
ieioScript = "script"
568

    
569
-- * Hooks
570

    
571
hooksNameCfgupdate :: String
572
hooksNameCfgupdate = "config-update"
573

    
574
hooksNameWatcher :: String
575
hooksNameWatcher = "watcher"
576

    
577
hooksPath :: String
578
hooksPath = "/sbin:/bin:/usr/sbin:/usr/bin"
579

    
580
hooksPhasePost :: String
581
hooksPhasePost = "post"
582

    
583
hooksPhasePre :: String
584
hooksPhasePre = "pre"
585

    
586
hooksVersion :: Int
587
hooksVersion = 2
588

    
589
-- * Hooks subject type (what object type does the LU deal with)
590

    
591
htypeCluster :: String
592
htypeCluster = "CLUSTER"
593

    
594
htypeGroup :: String
595
htypeGroup = "GROUP"
596

    
597
htypeInstance :: String
598
htypeInstance = "INSTANCE"
599

    
600
htypeNetwork :: String
601
htypeNetwork = "NETWORK"
602

    
603
htypeNode :: String
604
htypeNode = "NODE"
605

    
606
-- * Hkr
607

    
608
hkrSkip :: Int
609
hkrSkip = 0
610

    
611
hkrFail :: Int
612
hkrFail = 1
613

    
614
hkrSuccess :: Int
615
hkrSuccess = 2
616

    
617
-- * Storage types
618

    
619
stBlock :: String
620
stBlock = Types.storageTypeToRaw StorageBlock
621

    
622
stDiskless :: String
623
stDiskless = Types.storageTypeToRaw StorageDiskless
624

    
625
stExt :: String
626
stExt = Types.storageTypeToRaw StorageExt
627

    
628
stFile :: String
629
stFile = Types.storageTypeToRaw StorageFile
630

    
631
stLvmPv :: String
632
stLvmPv = Types.storageTypeToRaw StorageLvmPv
633

    
634
stLvmVg :: String
635
stLvmVg = Types.storageTypeToRaw StorageLvmVg
636

    
637
stRados :: String
638
stRados = Types.storageTypeToRaw StorageRados
639

    
640
storageTypes :: FrozenSet String
641
storageTypes = ConstantUtils.mkSet $ map Types.storageTypeToRaw [minBound..]
642

    
643
-- | The set of storage types for which storage reporting is available
644
--
645
-- FIXME: Remove this, once storage reporting is available for all
646
-- types.
647
stsReport :: FrozenSet String
648
stsReport = ConstantUtils.mkSet [stFile, stLvmPv, stLvmVg]
649

    
650
-- * Storage fields
651
-- ** First two are valid in LU context only, not passed to backend
652

    
653
sfNode :: String
654
sfNode = "node"
655

    
656
sfType :: String
657
sfType = "type"
658

    
659
-- ** and the rest are valid in backend
660

    
661
sfAllocatable :: String
662
sfAllocatable = Types.storageFieldToRaw SFAllocatable
663

    
664
sfFree :: String
665
sfFree = Types.storageFieldToRaw SFFree
666

    
667
sfName :: String
668
sfName = Types.storageFieldToRaw SFName
669

    
670
sfSize :: String
671
sfSize = Types.storageFieldToRaw SFSize
672

    
673
sfUsed :: String
674
sfUsed = Types.storageFieldToRaw SFUsed
675

    
676
validStorageFields :: FrozenSet String
677
validStorageFields =
678
  ConstantUtils.mkSet $ map Types.storageFieldToRaw [minBound..] ++
679
                        [sfNode, sfType]
680

    
681
modifiableStorageFields :: Map String (FrozenSet String)
682
modifiableStorageFields =
683
  Map.fromList [(Types.storageTypeToRaw StorageLvmPv,
684
                 ConstantUtils.mkSet [sfAllocatable])]
685

    
686
-- * Storage operations
687

    
688
soFixConsistency :: String
689
soFixConsistency = "fix-consistency"
690

    
691
validStorageOperations :: Map String (FrozenSet String)
692
validStorageOperations =
693
  Map.fromList [(Types.storageTypeToRaw StorageLvmVg,
694
                 ConstantUtils.mkSet [soFixConsistency])]
695

    
696
-- * Volume fields
697

    
698
vfDev :: String
699
vfDev = "dev"
700

    
701
vfInstance :: String
702
vfInstance = "instance"
703

    
704
vfName :: String
705
vfName = "name"
706

    
707
vfNode :: String
708
vfNode = "node"
709

    
710
vfPhys :: String
711
vfPhys = "phys"
712

    
713
vfSize :: String
714
vfSize = "size"
715

    
716
vfVg :: String
717
vfVg = "vg"
718

    
719
-- * Local disk status
720

    
721
ldsFaulty :: Int
722
ldsFaulty = Types.localDiskStatusToRaw DiskStatusFaulty
723

    
724
ldsOkay :: Int
725
ldsOkay = Types.localDiskStatusToRaw DiskStatusOk
726

    
727
ldsUnknown :: Int
728
ldsUnknown = Types.localDiskStatusToRaw DiskStatusUnknown
729

    
730
ldsNames :: Map Int String
731
ldsNames =
732
  Map.fromList [ (Types.localDiskStatusToRaw ds,
733
                  localDiskStatusName ds) | ds <- [minBound..] ]
734

    
735
-- * Disk template types
736

    
737
dtDiskless :: String
738
dtDiskless = Types.diskTemplateToRaw DTDiskless
739

    
740
dtFile :: String
741
dtFile = Types.diskTemplateToRaw DTFile
742

    
743
dtSharedFile :: String
744
dtSharedFile = Types.diskTemplateToRaw DTSharedFile
745

    
746
dtPlain :: String
747
dtPlain = Types.diskTemplateToRaw DTPlain
748

    
749
dtBlock :: String
750
dtBlock = Types.diskTemplateToRaw DTBlock
751

    
752
dtDrbd8 :: String
753
dtDrbd8 = Types.diskTemplateToRaw DTDrbd8
754

    
755
dtRbd :: String
756
dtRbd = Types.diskTemplateToRaw DTRbd
757

    
758
dtExt :: String
759
dtExt = Types.diskTemplateToRaw DTExt
760

    
761
-- | This is used to order determine the default disk template when
762
-- the list of enabled disk templates is inferred from the current
763
-- state of the cluster.  This only happens on an upgrade from a
764
-- version of Ganeti that did not support the 'enabled_disk_templates'
765
-- so far.
766
diskTemplatePreference :: [String]
767
diskTemplatePreference =
768
  map Types.diskTemplateToRaw
769
  [DTBlock, DTDiskless, DTDrbd8, DTExt, DTFile, DTPlain, DTRbd, DTSharedFile]
770

    
771
diskTemplates :: FrozenSet String
772
diskTemplates = ConstantUtils.mkSet $ map Types.diskTemplateToRaw [minBound..]
773

    
774
-- | Disk templates that are enabled by default
775
defaultEnabledDiskTemplates :: [String]
776
defaultEnabledDiskTemplates = map Types.diskTemplateToRaw [DTDrbd8, DTPlain]
777

    
778
-- | Mapping of disk templates to storage types
779
mapDiskTemplateStorageType :: Map String String
780
mapDiskTemplateStorageType =
781
  Map.fromList $
782
  map (Types.diskTemplateToRaw *** Types.storageTypeToRaw)
783
  [(DTBlock, StorageBlock),
784
   (DTDrbd8, StorageLvmVg),
785
   (DTExt, StorageExt),
786
   (DTSharedFile, StorageFile),
787
   (DTFile, StorageFile),
788
   (DTDiskless, StorageDiskless),
789
   (DTPlain, StorageLvmVg),
790
   (DTRbd, StorageRados)]
791

    
792
-- | The set of network-mirrored disk templates
793
dtsIntMirror :: FrozenSet String
794
dtsIntMirror = ConstantUtils.mkSet [dtDrbd8]
795

    
796
-- | 'DTDiskless' is 'trivially' externally mirrored
797
dtsExtMirror :: FrozenSet String
798
dtsExtMirror =
799
  ConstantUtils.mkSet $
800
  map Types.diskTemplateToRaw [DTDiskless, DTBlock, DTExt, DTSharedFile, DTRbd]
801

    
802
-- | The set of non-lvm-based disk templates
803
dtsNotLvm :: FrozenSet String
804
dtsNotLvm =
805
  ConstantUtils.mkSet $
806
  map Types.diskTemplateToRaw
807
  [DTSharedFile, DTDiskless, DTBlock, DTExt, DTFile, DTRbd]
808

    
809
-- | The set of disk templates which can be grown
810
dtsGrowable :: FrozenSet String
811
dtsGrowable =
812
  ConstantUtils.mkSet $
813
  map Types.diskTemplateToRaw
814
  [DTSharedFile, DTDrbd8, DTPlain, DTExt, DTFile, DTRbd]
815

    
816
-- | The set of disk templates that allow adoption
817
dtsMayAdopt :: FrozenSet String
818
dtsMayAdopt =
819
  ConstantUtils.mkSet $ map Types.diskTemplateToRaw [DTBlock, DTPlain]
820

    
821
-- | The set of disk templates that *must* use adoption
822
dtsMustAdopt :: FrozenSet String
823
dtsMustAdopt = ConstantUtils.mkSet [Types.diskTemplateToRaw DTBlock]
824

    
825
-- | The set of disk templates that allow migrations
826
dtsMirrored :: FrozenSet String
827
dtsMirrored = dtsIntMirror `ConstantUtils.union` dtsExtMirror
828

    
829
-- | The set of file based disk templates
830
dtsFilebased :: FrozenSet String
831
dtsFilebased =
832
  ConstantUtils.mkSet $ map Types.diskTemplateToRaw [DTSharedFile, DTFile]
833

    
834
-- | The set of disk templates that can be moved by copying
835
--
836
-- Note: a requirement is that they're not accessed externally or
837
-- shared between nodes; in particular, sharedfile is not suitable.
838
dtsCopyable :: FrozenSet String
839
dtsCopyable =
840
  ConstantUtils.mkSet $ map Types.diskTemplateToRaw [DTPlain, DTFile]
841

    
842
-- | The set of disk templates that are supported by exclusive_storage
843
dtsExclStorage :: FrozenSet String
844
dtsExclStorage = ConstantUtils.mkSet $ map Types.diskTemplateToRaw [DTPlain]
845

    
846
-- | Templates for which we don't perform checks on free space
847
dtsNoFreeSpaceCheck :: FrozenSet String
848
dtsNoFreeSpaceCheck =
849
  ConstantUtils.mkSet $
850
  map Types.diskTemplateToRaw [DTExt, DTSharedFile, DTFile, DTRbd]
851

    
852
dtsBlock :: FrozenSet String
853
dtsBlock =
854
  ConstantUtils.mkSet $
855
  map Types.diskTemplateToRaw [DTPlain, DTDrbd8, DTBlock, DTRbd, DTExt]
856

    
857
-- * Drbd
858

    
859
drbdHmacAlg :: String
860
drbdHmacAlg = "md5"
861

    
862
drbdDefaultNetProtocol :: String
863
drbdDefaultNetProtocol = "C"
864

    
865
drbdMigrationNetProtocol :: String
866
drbdMigrationNetProtocol = "C"
867

    
868
drbdStatusFile :: String
869
drbdStatusFile = "/proc/drbd"
870

    
871
-- | Size of DRBD meta block device
872
drbdMetaSize :: Int
873
drbdMetaSize = 128
874

    
875
-- * Drbd barrier types
876

    
877
drbdBDiskBarriers :: String
878
drbdBDiskBarriers = "b"
879

    
880
drbdBDiskDrain :: String
881
drbdBDiskDrain = "d"
882

    
883
drbdBDiskFlush :: String
884
drbdBDiskFlush = "f"
885

    
886
drbdBNone :: String
887
drbdBNone = "n"
888

    
889
-- | Rbd tool command
890
rbdCmd :: String
891
rbdCmd = "rbd"
892

    
893
-- * File backend driver
894

    
895
fdBlktap :: String
896
fdBlktap = Types.fileDriverToRaw FileBlktap
897

    
898
fdLoop :: String
899
fdLoop = Types.fileDriverToRaw FileLoop
900

    
901
fileDriver :: FrozenSet String
902
fileDriver =
903
  ConstantUtils.mkSet $
904
  map Types.fileDriverToRaw [minBound..]
905

    
906
-- | The set of drbd-like disk types
907
ldsDrbd :: FrozenSet String
908
ldsDrbd = ConstantUtils.mkSet [Types.diskTemplateToRaw DTDrbd8]
909

    
910
-- * Disk access mode
911

    
912
diskRdonly :: String
913
diskRdonly = Types.diskModeToRaw DiskRdOnly
914

    
915
diskRdwr :: String
916
diskRdwr = Types.diskModeToRaw DiskRdWr
917

    
918
diskAccessSet :: FrozenSet String
919
diskAccessSet = ConstantUtils.mkSet $ map Types.diskModeToRaw [minBound..]
920

    
921
-- * Disk replacement mode
922

    
923
replaceDiskAuto :: String
924
replaceDiskAuto = Types.replaceDisksModeToRaw ReplaceAuto
925

    
926
replaceDiskChg :: String
927
replaceDiskChg = Types.replaceDisksModeToRaw ReplaceNewSecondary
928

    
929
replaceDiskPri :: String
930
replaceDiskPri = Types.replaceDisksModeToRaw ReplaceOnPrimary
931

    
932
replaceDiskSec :: String
933
replaceDiskSec = Types.replaceDisksModeToRaw ReplaceOnSecondary
934

    
935
replaceModes :: FrozenSet String
936
replaceModes =
937
  ConstantUtils.mkSet $ map Types.replaceDisksModeToRaw [minBound..]
938

    
939
-- * Instance export mode
940

    
941
exportModeLocal :: String
942
exportModeLocal = Types.exportModeToRaw ExportModeLocal
943

    
944
exportModeRemote :: String
945
exportModeRemote = Types.exportModeToRaw ExportModeRemote
946

    
947
exportModes :: FrozenSet String
948
exportModes = ConstantUtils.mkSet $ map Types.exportModeToRaw [minBound..]
949

    
950
-- * Instance creation modes
951

    
952
instanceCreate :: String
953
instanceCreate = Types.instCreateModeToRaw InstCreate
954

    
955
instanceImport :: String
956
instanceImport = Types.instCreateModeToRaw InstImport
957

    
958
instanceRemoteImport :: String
959
instanceRemoteImport = Types.instCreateModeToRaw InstRemoteImport
960

    
961
instanceCreateModes :: FrozenSet String
962
instanceCreateModes =
963
  ConstantUtils.mkSet $ map Types.instCreateModeToRaw [minBound..]
964

    
965
-- * Remote import/export handshake message and version
966

    
967
rieHandshake :: String
968
rieHandshake = "Hi, I'm Ganeti"
969

    
970
rieVersion :: Int
971
rieVersion = 0
972

    
973
-- | Remote import/export certificate validity in seconds
974
rieCertValidity :: Int
975
rieCertValidity = 24 * 60 * 60
976

    
977
-- | Export only: how long to wait per connection attempt (seconds)
978
rieConnectAttemptTimeout :: Int
979
rieConnectAttemptTimeout = 20
980

    
981
-- | Export only: number of attempts to connect
982
rieConnectRetries :: Int
983
rieConnectRetries = 10
984

    
985
-- | Overall timeout for establishing connection
986
rieConnectTimeout :: Int
987
rieConnectTimeout = 180
988

    
989
-- | Give child process up to 5 seconds to exit after sending a signal
990
childLingerTimeout :: Double
991
childLingerTimeout = 5.0
992

    
993
-- * Import/export config options
994

    
995
inisectBep :: String
996
inisectBep = "backend"
997

    
998
inisectExp :: String
999
inisectExp = "export"
1000

    
1001
inisectHyp :: String
1002
inisectHyp = "hypervisor"
1003

    
1004
inisectIns :: String
1005
inisectIns = "instance"
1006

    
1007
inisectOsp :: String
1008
inisectOsp = "os"
1009

    
1010
-- * Dynamic device modification
1011

    
1012
ddmAdd :: String
1013
ddmAdd = Types.ddmFullToRaw DdmFullAdd
1014

    
1015
ddmModify :: String
1016
ddmModify = Types.ddmFullToRaw DdmFullModify
1017

    
1018
ddmRemove :: String
1019
ddmRemove = Types.ddmFullToRaw DdmFullRemove
1020

    
1021
ddmsValues :: FrozenSet String
1022
ddmsValues = ConstantUtils.mkSet [ddmAdd, ddmRemove]
1023

    
1024
ddmsValuesWithModify :: FrozenSet String
1025
ddmsValuesWithModify = ConstantUtils.mkSet $ map Types.ddmFullToRaw [minBound..]
1026

    
1027
-- * Common exit codes
1028

    
1029
exitSuccess :: Int
1030
exitSuccess = 0
1031

    
1032
exitFailure :: Int
1033
exitFailure = ConstantUtils.exitFailure
1034

    
1035
exitNotcluster :: Int
1036
exitNotcluster = 5
1037

    
1038
exitNotmaster :: Int
1039
exitNotmaster = 11
1040

    
1041
exitNodesetupError :: Int
1042
exitNodesetupError = 12
1043

    
1044
-- | Need user confirmation
1045
exitConfirmation :: Int
1046
exitConfirmation = 13
1047

    
1048
-- | Exit code for query operations with unknown fields
1049
exitUnknownField :: Int
1050
exitUnknownField = 14
1051

    
1052
-- * Tags
1053

    
1054
tagCluster :: String
1055
tagCluster = Types.tagKindToRaw TagKindCluster
1056

    
1057
tagInstance :: String
1058
tagInstance = Types.tagKindToRaw TagKindInstance
1059

    
1060
tagNetwork :: String
1061
tagNetwork = Types.tagKindToRaw TagKindNetwork
1062

    
1063
tagNode :: String
1064
tagNode = Types.tagKindToRaw TagKindNode
1065

    
1066
tagNodegroup :: String
1067
tagNodegroup = Types.tagKindToRaw TagKindGroup
1068

    
1069
validTagTypes :: FrozenSet String
1070
validTagTypes = ConstantUtils.mkSet $ map Types.tagKindToRaw [minBound..]
1071

    
1072
maxTagLen :: Int
1073
maxTagLen = 128
1074

    
1075
maxTagsPerObj :: Int
1076
maxTagsPerObj = 4096
1077

    
1078
-- * Others
1079

    
1080
defaultBridge :: String
1081
defaultBridge = "xen-br0"
1082

    
1083
defaultOvs :: String
1084
defaultOvs = "switch1"
1085

    
1086
-- | 60 MiB, expressed in KiB
1087
classicDrbdSyncSpeed :: Int
1088
classicDrbdSyncSpeed = 60 * 1024
1089

    
1090
ip4AddressAny :: String
1091
ip4AddressAny = "0.0.0.0"
1092

    
1093
ip4AddressLocalhost :: String
1094
ip4AddressLocalhost = "127.0.0.1"
1095

    
1096
ip6AddressAny :: String
1097
ip6AddressAny = "::"
1098

    
1099
ip6AddressLocalhost :: String
1100
ip6AddressLocalhost = "::1"
1101

    
1102
ip4Version :: Int
1103
ip4Version = 4
1104

    
1105
ip6Version :: Int
1106
ip6Version = 6
1107

    
1108
validIpVersions :: FrozenSet Int
1109
validIpVersions = ConstantUtils.mkSet [ip4Version, ip6Version]
1110

    
1111
tcpPingTimeout :: Int
1112
tcpPingTimeout = 10
1113

    
1114
defaultVg :: String
1115
defaultVg = "xenvg"
1116

    
1117
defaultDrbdHelper :: String
1118
defaultDrbdHelper = "/bin/true"
1119

    
1120
minVgSize :: Int
1121
minVgSize = 20480
1122

    
1123
defaultMacPrefix :: String
1124
defaultMacPrefix = "aa:00:00"
1125

    
1126
-- | Default maximum instance wait time, in seconds.
1127
defaultShutdownTimeout :: Int
1128
defaultShutdownTimeout = 120
1129

    
1130
-- | Node clock skew in seconds
1131
nodeMaxClockSkew :: Int
1132
nodeMaxClockSkew = 150
1133

    
1134
-- | Time for an intra-cluster disk transfer to wait for a connection
1135
diskTransferConnectTimeout :: Int
1136
diskTransferConnectTimeout = 60
1137

    
1138
-- | Disk index separator
1139
diskSeparator :: String
1140
diskSeparator = AutoConf.diskSeparator
1141

    
1142
ipCommandPath :: String
1143
ipCommandPath = AutoConf.ipPath
1144

    
1145
-- | Key for job IDs in opcode result
1146
jobIdsKey :: String
1147
jobIdsKey = "jobs"
1148

    
1149
-- * Runparts results
1150

    
1151
runpartsErr :: Int
1152
runpartsErr = 2
1153

    
1154
runpartsRun :: Int
1155
runpartsRun = 1
1156

    
1157
runpartsSkip :: Int
1158
runpartsSkip = 0
1159

    
1160
runpartsStatus :: [Int]
1161
runpartsStatus = [runpartsErr, runpartsRun, runpartsSkip]
1162

    
1163
-- * RPC
1164

    
1165
rpcEncodingNone :: Int
1166
rpcEncodingNone = 0
1167

    
1168
rpcEncodingZlibBase64 :: Int
1169
rpcEncodingZlibBase64 = 1
1170

    
1171
-- * Timeout table
1172
--
1173
-- Various time constants for the timeout table
1174

    
1175
rpcTmoUrgent :: Int
1176
rpcTmoUrgent = Types.rpcTimeoutToRaw Urgent
1177

    
1178
rpcTmoFast :: Int
1179
rpcTmoFast = Types.rpcTimeoutToRaw Fast
1180

    
1181
rpcTmoNormal :: Int
1182
rpcTmoNormal = Types.rpcTimeoutToRaw Normal
1183

    
1184
rpcTmoSlow :: Int
1185
rpcTmoSlow = Types.rpcTimeoutToRaw Slow
1186

    
1187
-- | 'rpcTmo_4hrs' contains an underscore to circumvent a limitation
1188
-- in the 'Ganeti.THH.deCamelCase' function and generate the correct
1189
-- Python name.
1190
rpcTmo_4hrs :: Int
1191
rpcTmo_4hrs = Types.rpcTimeoutToRaw FourHours
1192

    
1193
-- | 'rpcTmo_1day' contains an underscore to circumvent a limitation
1194
-- in the 'Ganeti.THH.deCamelCase' function and generate the correct
1195
-- Python name.
1196
rpcTmo_1day :: Int
1197
rpcTmo_1day = Types.rpcTimeoutToRaw OneDay
1198

    
1199
-- | Timeout for connecting to nodes (seconds)
1200
rpcConnectTimeout :: Int
1201
rpcConnectTimeout = 5
1202

    
1203
-- OS
1204

    
1205
osScriptCreate :: String
1206
osScriptCreate = "create"
1207

    
1208
osScriptExport :: String
1209
osScriptExport = "export"
1210

    
1211
osScriptImport :: String
1212
osScriptImport = "import"
1213

    
1214
osScriptRename :: String
1215
osScriptRename = "rename"
1216

    
1217
osScriptVerify :: String
1218
osScriptVerify = "verify"
1219

    
1220
osScripts :: [String]
1221
osScripts = [osScriptCreate, osScriptExport, osScriptImport, osScriptRename,
1222
             osScriptVerify]
1223

    
1224
osApiFile :: String
1225
osApiFile = "ganeti_api_version"
1226

    
1227
osVariantsFile :: String
1228
osVariantsFile = "variants.list"
1229

    
1230
osParametersFile :: String
1231
osParametersFile = "parameters.list"
1232

    
1233
osValidateParameters :: String
1234
osValidateParameters = "parameters"
1235

    
1236
osValidateCalls :: FrozenSet String
1237
osValidateCalls = ConstantUtils.mkSet [osValidateParameters]
1238

    
1239
-- | External Storage (ES) related constants
1240

    
1241
esActionAttach :: String
1242
esActionAttach = "attach"
1243

    
1244
esActionCreate :: String
1245
esActionCreate = "create"
1246

    
1247
esActionDetach :: String
1248
esActionDetach = "detach"
1249

    
1250
esActionGrow :: String
1251
esActionGrow = "grow"
1252

    
1253
esActionRemove :: String
1254
esActionRemove = "remove"
1255

    
1256
esActionSetinfo :: String
1257
esActionSetinfo = "setinfo"
1258

    
1259
esActionVerify :: String
1260
esActionVerify = "verify"
1261

    
1262
esScriptCreate :: String
1263
esScriptCreate = esActionCreate
1264

    
1265
esScriptRemove :: String
1266
esScriptRemove = esActionRemove
1267

    
1268
esScriptGrow :: String
1269
esScriptGrow = esActionGrow
1270

    
1271
esScriptAttach :: String
1272
esScriptAttach = esActionAttach
1273

    
1274
esScriptDetach :: String
1275
esScriptDetach = esActionDetach
1276

    
1277
esScriptSetinfo :: String
1278
esScriptSetinfo = esActionSetinfo
1279

    
1280
esScriptVerify :: String
1281
esScriptVerify = esActionVerify
1282

    
1283
esScripts :: FrozenSet String
1284
esScripts =
1285
  ConstantUtils.mkSet [esScriptAttach,
1286
                       esScriptCreate,
1287
                       esScriptDetach,
1288
                       esScriptGrow,
1289
                       esScriptRemove,
1290
                       esScriptSetinfo,
1291
                       esScriptVerify]
1292

    
1293
esParametersFile :: String
1294
esParametersFile = "parameters.list"
1295

    
1296
-- * VTypes
1297

    
1298
vtypeBool :: VType
1299
vtypeBool = VTypeBool
1300

    
1301
vtypeInt :: VType
1302
vtypeInt = VTypeInt
1303

    
1304
vtypeMaybeString :: VType
1305
vtypeMaybeString = VTypeMaybeString
1306

    
1307
-- | Size in MiBs
1308
vtypeSize :: VType
1309
vtypeSize = VTypeSize
1310

    
1311
vtypeString :: VType
1312
vtypeString = VTypeString
1313

    
1314
enforceableTypes :: FrozenSet VType
1315
enforceableTypes = ConstantUtils.mkSet [minBound..]
1316

    
1317
-- | Instance specs
1318
--
1319
-- FIXME: these should be associated with 'Ganeti.HTools.Types.ISpec'
1320

    
1321
ispecMemSize :: String
1322
ispecMemSize = ConstantUtils.ispecMemSize
1323

    
1324
ispecCpuCount :: String
1325
ispecCpuCount = ConstantUtils.ispecCpuCount
1326

    
1327
ispecDiskCount :: String
1328
ispecDiskCount = ConstantUtils.ispecDiskCount
1329

    
1330
ispecDiskSize :: String
1331
ispecDiskSize = ConstantUtils.ispecDiskSize
1332

    
1333
ispecNicCount :: String
1334
ispecNicCount = ConstantUtils.ispecNicCount
1335

    
1336
ispecSpindleUse :: String
1337
ispecSpindleUse = ConstantUtils.ispecSpindleUse
1338

    
1339
ispecsParameterTypes :: Map String VType
1340
ispecsParameterTypes =
1341
  Map.fromList
1342
  [(ConstantUtils.ispecDiskSize, VTypeInt),
1343
   (ConstantUtils.ispecCpuCount, VTypeInt),
1344
   (ConstantUtils.ispecSpindleUse, VTypeInt),
1345
   (ConstantUtils.ispecMemSize, VTypeInt),
1346
   (ConstantUtils.ispecNicCount, VTypeInt),
1347
   (ConstantUtils.ispecDiskCount, VTypeInt)]
1348

    
1349
ispecsParameters :: FrozenSet String
1350
ispecsParameters =
1351
  ConstantUtils.mkSet [ConstantUtils.ispecCpuCount,
1352
                       ConstantUtils.ispecDiskCount,
1353
                       ConstantUtils.ispecDiskSize,
1354
                       ConstantUtils.ispecMemSize,
1355
                       ConstantUtils.ispecNicCount,
1356
                       ConstantUtils.ispecSpindleUse]
1357

    
1358
ispecsMinmax :: String
1359
ispecsMinmax = ConstantUtils.ispecsMinmax
1360

    
1361
ispecsMax :: String
1362
ispecsMax = "max"
1363

    
1364
ispecsMin :: String
1365
ispecsMin = "min"
1366

    
1367
ispecsStd :: String
1368
ispecsStd = ConstantUtils.ispecsStd
1369

    
1370
ipolicyDts :: String
1371
ipolicyDts = ConstantUtils.ipolicyDts
1372

    
1373
ipolicyVcpuRatio :: String
1374
ipolicyVcpuRatio = ConstantUtils.ipolicyVcpuRatio
1375

    
1376
ipolicySpindleRatio :: String
1377
ipolicySpindleRatio = ConstantUtils.ipolicySpindleRatio
1378

    
1379
ispecsMinmaxKeys :: FrozenSet String
1380
ispecsMinmaxKeys = ConstantUtils.mkSet [ispecsMax, ispecsMin]
1381

    
1382
ipolicyParameters :: FrozenSet String
1383
ipolicyParameters =
1384
  ConstantUtils.mkSet [ConstantUtils.ipolicyVcpuRatio,
1385
                       ConstantUtils.ipolicySpindleRatio]
1386

    
1387
ipolicyAllKeys :: FrozenSet String
1388
ipolicyAllKeys =
1389
  ConstantUtils.union ipolicyParameters $
1390
  ConstantUtils.mkSet [ConstantUtils.ipolicyDts,
1391
                       ConstantUtils.ispecsMinmax,
1392
                       ispecsStd]
1393

    
1394
-- | Node parameter names
1395

    
1396
ndExclusiveStorage :: String
1397
ndExclusiveStorage = "exclusive_storage"
1398

    
1399
ndOobProgram :: String
1400
ndOobProgram = "oob_program"
1401

    
1402
ndSpindleCount :: String
1403
ndSpindleCount = "spindle_count"
1404

    
1405
ndOvs :: String
1406
ndOvs = "ovs"
1407

    
1408
ndOvsLink :: String
1409
ndOvsLink = "ovs_link"
1410

    
1411
ndOvsName :: String
1412
ndOvsName = "ovs_name"
1413

    
1414
ndsParameterTypes :: Map String VType
1415
ndsParameterTypes =
1416
  Map.fromList
1417
  [(ndExclusiveStorage, VTypeBool),
1418
   (ndOobProgram, VTypeString),
1419
   (ndOvs, VTypeBool),
1420
   (ndOvsLink, VTypeMaybeString),
1421
   (ndOvsName, VTypeMaybeString),
1422
   (ndSpindleCount, VTypeInt)]
1423

    
1424
ndsParameters :: FrozenSet String
1425
ndsParameters = ConstantUtils.mkSet (Map.keys ndsParameterTypes)
1426

    
1427
ndsParameterTitles :: Map String String
1428
ndsParameterTitles =
1429
  Map.fromList
1430
  [(ndExclusiveStorage, "ExclusiveStorage"),
1431
   (ndOobProgram, "OutOfBandProgram"),
1432
   (ndOvs, "OpenvSwitch"),
1433
   (ndOvsLink, "OpenvSwitchLink"),
1434
   (ndOvsName, "OpenvSwitchName"),
1435
   (ndSpindleCount, "SpindleCount")]
1436

    
1437

    
1438
-- * Reboot types
1439

    
1440
instanceRebootSoft :: String
1441
instanceRebootSoft = Types.rebootTypeToRaw RebootSoft
1442

    
1443
instanceRebootHard :: String
1444
instanceRebootHard = Types.rebootTypeToRaw RebootHard
1445

    
1446
instanceRebootFull :: String
1447
instanceRebootFull = Types.rebootTypeToRaw RebootFull
1448

    
1449
rebootTypes :: FrozenSet String
1450
rebootTypes = ConstantUtils.mkSet $ map Types.rebootTypeToRaw [minBound..]
1451

    
1452
-- * OOB supported commands
1453

    
1454
oobPowerOn :: String
1455
oobPowerOn = Types.oobCommandToRaw OobPowerOn
1456

    
1457
oobPowerOff :: String
1458
oobPowerOff = Types.oobCommandToRaw OobPowerOff
1459

    
1460
oobPowerCycle :: String
1461
oobPowerCycle = Types.oobCommandToRaw OobPowerCycle
1462

    
1463
oobPowerStatus :: String
1464
oobPowerStatus = Types.oobCommandToRaw OobPowerStatus
1465

    
1466
oobHealth :: String
1467
oobHealth = Types.oobCommandToRaw OobHealth
1468

    
1469
oobCommands :: FrozenSet String
1470
oobCommands = ConstantUtils.mkSet $ map Types.oobCommandToRaw [minBound..]
1471

    
1472
oobPowerStatusPowered :: String
1473
oobPowerStatusPowered = "powered"
1474

    
1475
-- | 60 seconds
1476
oobTimeout :: Int
1477
oobTimeout = 60
1478

    
1479
-- | 2 seconds
1480
oobPowerDelay :: Double
1481
oobPowerDelay = 2.0
1482

    
1483
oobStatusCritical :: String
1484
oobStatusCritical = Types.oobStatusToRaw OobStatusCritical
1485

    
1486
oobStatusOk :: String
1487
oobStatusOk = Types.oobStatusToRaw OobStatusOk
1488

    
1489
oobStatusUnknown :: String
1490
oobStatusUnknown = Types.oobStatusToRaw OobStatusUnknown
1491

    
1492
oobStatusWarning :: String
1493
oobStatusWarning = Types.oobStatusToRaw OobStatusWarning
1494

    
1495
oobStatuses :: FrozenSet String
1496
oobStatuses = ConstantUtils.mkSet $ map Types.oobStatusToRaw [minBound..]
1497

    
1498
-- * NIC_* constants are used inside the ganeti config
1499

    
1500
nicLink :: String
1501
nicLink = "link"
1502

    
1503
nicMode :: String
1504
nicMode = "mode"
1505

    
1506
nicVlan :: String
1507
nicVlan = "vlan"
1508

    
1509
nicModeBridged :: String
1510
nicModeBridged = Types.nICModeToRaw NMBridged
1511

    
1512
nicModeRouted :: String
1513
nicModeRouted = Types.nICModeToRaw NMRouted
1514

    
1515
nicModeOvs :: String
1516
nicModeOvs = Types.nICModeToRaw NMOvs
1517

    
1518
nicIpPool :: String
1519
nicIpPool = Types.nICModeToRaw NMPool
1520

    
1521
nicValidModes :: FrozenSet String
1522
nicValidModes = ConstantUtils.mkSet $ map Types.nICModeToRaw [minBound..]
1523

    
1524
-- * Hypervisor constants
1525

    
1526
htXenPvm :: String
1527
htXenPvm = Types.hypervisorToRaw XenPvm
1528

    
1529
htFake :: String
1530
htFake = Types.hypervisorToRaw Fake
1531

    
1532
htXenHvm :: String
1533
htXenHvm = Types.hypervisorToRaw XenHvm
1534

    
1535
htKvm :: String
1536
htKvm = Types.hypervisorToRaw Kvm
1537

    
1538
htChroot :: String
1539
htChroot = Types.hypervisorToRaw Chroot
1540

    
1541
htLxc :: String
1542
htLxc = Types.hypervisorToRaw Lxc
1543

    
1544
hyperTypes :: FrozenSet String
1545
hyperTypes = ConstantUtils.mkSet $ map Types.hypervisorToRaw [minBound..]
1546

    
1547
htsReqPort :: FrozenSet String
1548
htsReqPort = ConstantUtils.mkSet [htXenHvm, htKvm]
1549

    
1550
-- * Migration type
1551

    
1552
htMigrationLive :: String
1553
htMigrationLive = Types.migrationModeToRaw MigrationLive
1554

    
1555
htMigrationNonlive :: String
1556
htMigrationNonlive = Types.migrationModeToRaw MigrationNonLive
1557

    
1558
htMigrationModes :: FrozenSet String
1559
htMigrationModes =
1560
  ConstantUtils.mkSet $ map Types.migrationModeToRaw [minBound..]
1561

    
1562
-- * Cluster verify steps
1563

    
1564
verifyNplusoneMem :: String
1565
verifyNplusoneMem = Types.verifyOptionalChecksToRaw VerifyNPlusOneMem
1566

    
1567
verifyOptionalChecks :: FrozenSet String
1568
verifyOptionalChecks =
1569
  ConstantUtils.mkSet $ map Types.verifyOptionalChecksToRaw [minBound..]
1570

    
1571
-- * Cluster Verify error classes
1572

    
1573
cvTcluster :: String
1574
cvTcluster = "cluster"
1575

    
1576
cvTgroup :: String
1577
cvTgroup = "group"
1578

    
1579
cvTnode :: String
1580
cvTnode = "node"
1581

    
1582
cvTinstance :: String
1583
cvTinstance = "instance"
1584

    
1585
-- * Cluster Verify error codes and documentation
1586

    
1587
cvEclustercert :: (String, String, String)
1588
cvEclustercert =
1589
  ("cluster",
1590
   Types.cVErrorCodeToRaw CvECLUSTERCERT,
1591
   "Cluster certificate files verification failure")
1592

    
1593
cvEclustercfg :: (String, String, String)
1594
cvEclustercfg =
1595
  ("cluster",
1596
   Types.cVErrorCodeToRaw CvECLUSTERCFG,
1597
   "Cluster configuration verification failure")
1598

    
1599
cvEclusterdanglinginst :: (String, String, String)
1600
cvEclusterdanglinginst =
1601
  ("node",
1602
   Types.cVErrorCodeToRaw CvECLUSTERDANGLINGINST,
1603
   "Some instances have a non-existing primary node")
1604

    
1605
cvEclusterdanglingnodes :: (String, String, String)
1606
cvEclusterdanglingnodes =
1607
  ("node",
1608
   Types.cVErrorCodeToRaw CvECLUSTERDANGLINGNODES,
1609
   "Some nodes belong to non-existing groups")
1610

    
1611
cvEclusterfilecheck :: (String, String, String)
1612
cvEclusterfilecheck =
1613
  ("cluster",
1614
   Types.cVErrorCodeToRaw CvECLUSTERFILECHECK,
1615
   "Cluster configuration verification failure")
1616

    
1617
cvEgroupdifferentpvsize :: (String, String, String)
1618
cvEgroupdifferentpvsize =
1619
  ("group",
1620
   Types.cVErrorCodeToRaw CvEGROUPDIFFERENTPVSIZE,
1621
   "PVs in the group have different sizes")
1622

    
1623
cvEinstancebadnode :: (String, String, String)
1624
cvEinstancebadnode =
1625
  ("instance",
1626
   Types.cVErrorCodeToRaw CvEINSTANCEBADNODE,
1627
   "Instance marked as running lives on an offline node")
1628

    
1629
cvEinstancedown :: (String, String, String)
1630
cvEinstancedown =
1631
  ("instance",
1632
   Types.cVErrorCodeToRaw CvEINSTANCEDOWN,
1633
   "Instance not running on its primary node")
1634

    
1635
cvEinstancefaultydisk :: (String, String, String)
1636
cvEinstancefaultydisk =
1637
  ("instance",
1638
   Types.cVErrorCodeToRaw CvEINSTANCEFAULTYDISK,
1639
   "Impossible to retrieve status for a disk")
1640

    
1641
cvEinstancelayout :: (String, String, String)
1642
cvEinstancelayout =
1643
  ("instance",
1644
   Types.cVErrorCodeToRaw CvEINSTANCELAYOUT,
1645
   "Instance has multiple secondary nodes")
1646

    
1647
cvEinstancemissingcfgparameter :: (String, String, String)
1648
cvEinstancemissingcfgparameter =
1649
  ("instance",
1650
   Types.cVErrorCodeToRaw CvEINSTANCEMISSINGCFGPARAMETER,
1651
   "A configuration parameter for an instance is missing")
1652

    
1653
cvEinstancemissingdisk :: (String, String, String)
1654
cvEinstancemissingdisk =
1655
  ("instance",
1656
   Types.cVErrorCodeToRaw CvEINSTANCEMISSINGDISK,
1657
   "Missing volume on an instance")
1658

    
1659
cvEinstancepolicy :: (String, String, String)
1660
cvEinstancepolicy =
1661
  ("instance",
1662
   Types.cVErrorCodeToRaw CvEINSTANCEPOLICY,
1663
   "Instance does not meet policy")
1664

    
1665
cvEinstancesplitgroups :: (String, String, String)
1666
cvEinstancesplitgroups =
1667
  ("instance",
1668
   Types.cVErrorCodeToRaw CvEINSTANCESPLITGROUPS,
1669
   "Instance with primary and secondary nodes in different groups")
1670

    
1671
cvEinstanceunsuitablenode :: (String, String, String)
1672
cvEinstanceunsuitablenode =
1673
  ("instance",
1674
   Types.cVErrorCodeToRaw CvEINSTANCEUNSUITABLENODE,
1675
   "Instance running on nodes that are not suitable for it")
1676

    
1677
cvEinstancewrongnode :: (String, String, String)
1678
cvEinstancewrongnode =
1679
  ("instance",
1680
   Types.cVErrorCodeToRaw CvEINSTANCEWRONGNODE,
1681
   "Instance running on the wrong node")
1682

    
1683
cvEnodedrbd :: (String, String, String)
1684
cvEnodedrbd =
1685
  ("node",
1686
   Types.cVErrorCodeToRaw CvENODEDRBD,
1687
   "Error parsing the DRBD status file")
1688

    
1689
cvEnodedrbdhelper :: (String, String, String)
1690
cvEnodedrbdhelper =
1691
  ("node",
1692
   Types.cVErrorCodeToRaw CvENODEDRBDHELPER,
1693
   "Error caused by the DRBD helper")
1694

    
1695
cvEnodedrbdversion :: (String, String, String)
1696
cvEnodedrbdversion =
1697
  ("node",
1698
   Types.cVErrorCodeToRaw CvENODEDRBDVERSION,
1699
   "DRBD version mismatch within a node group")
1700

    
1701
cvEnodefilecheck :: (String, String, String)
1702
cvEnodefilecheck =
1703
  ("node",
1704
   Types.cVErrorCodeToRaw CvENODEFILECHECK,
1705
   "Error retrieving the checksum of the node files")
1706

    
1707
cvEnodefilestoragepaths :: (String, String, String)
1708
cvEnodefilestoragepaths =
1709
  ("node",
1710
   Types.cVErrorCodeToRaw CvENODEFILESTORAGEPATHS,
1711
   "Detected bad file storage paths")
1712

    
1713
cvEnodefilestoragepathunusable :: (String, String, String)
1714
cvEnodefilestoragepathunusable =
1715
  ("node",
1716
   Types.cVErrorCodeToRaw CvENODEFILESTORAGEPATHUNUSABLE,
1717
   "File storage path unusable")
1718

    
1719
cvEnodehooks :: (String, String, String)
1720
cvEnodehooks =
1721
  ("node",
1722
   Types.cVErrorCodeToRaw CvENODEHOOKS,
1723
   "Communication failure in hooks execution")
1724

    
1725
cvEnodehv :: (String, String, String)
1726
cvEnodehv =
1727
  ("node",
1728
   Types.cVErrorCodeToRaw CvENODEHV,
1729
   "Hypervisor parameters verification failure")
1730

    
1731
cvEnodelvm :: (String, String, String)
1732
cvEnodelvm =
1733
  ("node",
1734
   Types.cVErrorCodeToRaw CvENODELVM,
1735
   "LVM-related node error")
1736

    
1737
cvEnoden1 :: (String, String, String)
1738
cvEnoden1 =
1739
  ("node",
1740
   Types.cVErrorCodeToRaw CvENODEN1,
1741
   "Not enough memory to accommodate instance failovers")
1742

    
1743
cvEnodenet :: (String, String, String)
1744
cvEnodenet =
1745
  ("node",
1746
   Types.cVErrorCodeToRaw CvENODENET,
1747
   "Network-related node error")
1748

    
1749
cvEnodeoobpath :: (String, String, String)
1750
cvEnodeoobpath =
1751
  ("node",
1752
   Types.cVErrorCodeToRaw CvENODEOOBPATH,
1753
   "Invalid Out Of Band path")
1754

    
1755
cvEnodeorphaninstance :: (String, String, String)
1756
cvEnodeorphaninstance =
1757
  ("node",
1758
   Types.cVErrorCodeToRaw CvENODEORPHANINSTANCE,
1759
   "Unknown intance running on a node")
1760

    
1761
cvEnodeorphanlv :: (String, String, String)
1762
cvEnodeorphanlv =
1763
  ("node",
1764
   Types.cVErrorCodeToRaw CvENODEORPHANLV,
1765
   "Unknown LVM logical volume")
1766

    
1767
cvEnodeos :: (String, String, String)
1768
cvEnodeos =
1769
  ("node",
1770
   Types.cVErrorCodeToRaw CvENODEOS,
1771
   "OS-related node error")
1772

    
1773
cvEnoderpc :: (String, String, String)
1774
cvEnoderpc =
1775
  ("node",
1776
   Types.cVErrorCodeToRaw CvENODERPC,
1777
   "Error during connection to the primary node of an instance")
1778

    
1779
cvEnodesetup :: (String, String, String)
1780
cvEnodesetup =
1781
  ("node",
1782
   Types.cVErrorCodeToRaw CvENODESETUP,
1783
   "Node setup error")
1784

    
1785
cvEnodesharedfilestoragepathunusable :: (String, String, String)
1786
cvEnodesharedfilestoragepathunusable =
1787
  ("node",
1788
   Types.cVErrorCodeToRaw CvENODESHAREDFILESTORAGEPATHUNUSABLE,
1789
   "Shared file storage path unusable")
1790

    
1791
cvEnodessh :: (String, String, String)
1792
cvEnodessh =
1793
  ("node",
1794
   Types.cVErrorCodeToRaw CvENODESSH,
1795
   "SSH-related node error")
1796

    
1797
cvEnodetime :: (String, String, String)
1798
cvEnodetime =
1799
  ("node",
1800
   Types.cVErrorCodeToRaw CvENODETIME,
1801
   "Node returned invalid time")
1802

    
1803
cvEnodeuserscripts :: (String, String, String)
1804
cvEnodeuserscripts =
1805
  ("node",
1806
   Types.cVErrorCodeToRaw CvENODEUSERSCRIPTS,
1807
   "User scripts not present or not executable")
1808

    
1809
cvEnodeversion :: (String, String, String)
1810
cvEnodeversion =
1811
  ("node",
1812
   Types.cVErrorCodeToRaw CvENODEVERSION,
1813
   "Protocol version mismatch or Ganeti version mismatch")
1814

    
1815
cvAllEcodes :: FrozenSet (String, String, String)
1816
cvAllEcodes =
1817
  ConstantUtils.mkSet
1818
  [cvEclustercert,
1819
   cvEclustercfg,
1820
   cvEclusterdanglinginst,
1821
   cvEclusterdanglingnodes,
1822
   cvEclusterfilecheck,
1823
   cvEgroupdifferentpvsize,
1824
   cvEinstancebadnode,
1825
   cvEinstancedown,
1826
   cvEinstancefaultydisk,
1827
   cvEinstancelayout,
1828
   cvEinstancemissingcfgparameter,
1829
   cvEinstancemissingdisk,
1830
   cvEinstancepolicy,
1831
   cvEinstancesplitgroups,
1832
   cvEinstanceunsuitablenode,
1833
   cvEinstancewrongnode,
1834
   cvEnodedrbd,
1835
   cvEnodedrbdhelper,
1836
   cvEnodedrbdversion,
1837
   cvEnodefilecheck,
1838
   cvEnodefilestoragepaths,
1839
   cvEnodefilestoragepathunusable,
1840
   cvEnodehooks,
1841
   cvEnodehv,
1842
   cvEnodelvm,
1843
   cvEnoden1,
1844
   cvEnodenet,
1845
   cvEnodeoobpath,
1846
   cvEnodeorphaninstance,
1847
   cvEnodeorphanlv,
1848
   cvEnodeos,
1849
   cvEnoderpc,
1850
   cvEnodesetup,
1851
   cvEnodesharedfilestoragepathunusable,
1852
   cvEnodessh,
1853
   cvEnodetime,
1854
   cvEnodeuserscripts,
1855
   cvEnodeversion]
1856

    
1857
cvAllEcodesStrings :: FrozenSet String
1858
cvAllEcodesStrings =
1859
  ConstantUtils.mkSet $ map Types.cVErrorCodeToRaw [minBound..]
1860

    
1861
-- * Instance status
1862

    
1863
inststAdmindown :: String
1864
inststAdmindown = Types.instanceStatusToRaw StatusDown
1865

    
1866
inststAdminoffline :: String
1867
inststAdminoffline = Types.instanceStatusToRaw StatusOffline
1868

    
1869
inststErrordown :: String
1870
inststErrordown = Types.instanceStatusToRaw ErrorDown
1871

    
1872
inststErrorup :: String
1873
inststErrorup = Types.instanceStatusToRaw ErrorUp
1874

    
1875
inststNodedown :: String
1876
inststNodedown = Types.instanceStatusToRaw NodeDown
1877

    
1878
inststNodeoffline :: String
1879
inststNodeoffline = Types.instanceStatusToRaw NodeOffline
1880

    
1881
inststRunning :: String
1882
inststRunning = Types.instanceStatusToRaw Running
1883

    
1884
inststWrongnode :: String
1885
inststWrongnode = Types.instanceStatusToRaw WrongNode
1886

    
1887
inststAll :: FrozenSet String
1888
inststAll = ConstantUtils.mkSet $ map Types.instanceStatusToRaw [minBound..]
1889

    
1890
-- * Admin states
1891

    
1892
adminstDown :: String
1893
adminstDown = Types.adminStateToRaw AdminDown
1894

    
1895
adminstOffline :: String
1896
adminstOffline = Types.adminStateToRaw AdminOffline
1897

    
1898
adminstUp :: String
1899
adminstUp = Types.adminStateToRaw AdminUp
1900

    
1901
adminstAll :: FrozenSet String
1902
adminstAll = ConstantUtils.mkSet $ map Types.adminStateToRaw [minBound..]
1903

    
1904
-- * Node roles
1905

    
1906
nrDrained :: String
1907
nrDrained = Types.nodeRoleToRaw NRDrained
1908

    
1909
nrMaster :: String
1910
nrMaster = Types.nodeRoleToRaw NRMaster
1911

    
1912
nrMcandidate :: String
1913
nrMcandidate = Types.nodeRoleToRaw NRCandidate
1914

    
1915
nrOffline :: String
1916
nrOffline = Types.nodeRoleToRaw NROffline
1917

    
1918
nrRegular :: String
1919
nrRegular = Types.nodeRoleToRaw NRRegular
1920

    
1921
nrAll :: FrozenSet String
1922
nrAll = ConstantUtils.mkSet $ map Types.nodeRoleToRaw [minBound..]
1923

    
1924
-- * Allocator framework constants
1925

    
1926
iallocatorVersion :: Int
1927
iallocatorVersion = 2
1928

    
1929
iallocatorDirIn :: String
1930
iallocatorDirIn = Types.iAllocatorTestDirToRaw IAllocatorDirIn
1931

    
1932
iallocatorDirOut :: String
1933
iallocatorDirOut = Types.iAllocatorTestDirToRaw IAllocatorDirOut
1934

    
1935
validIallocatorDirections :: FrozenSet String
1936
validIallocatorDirections =
1937
  ConstantUtils.mkSet $ map Types.iAllocatorTestDirToRaw [minBound..]
1938

    
1939
iallocatorModeAlloc :: String
1940
iallocatorModeAlloc = Types.iAllocatorModeToRaw IAllocatorAlloc
1941

    
1942
iallocatorModeChgGroup :: String
1943
iallocatorModeChgGroup = Types.iAllocatorModeToRaw IAllocatorChangeGroup
1944

    
1945
iallocatorModeMultiAlloc :: String
1946
iallocatorModeMultiAlloc = Types.iAllocatorModeToRaw IAllocatorMultiAlloc
1947

    
1948
iallocatorModeNodeEvac :: String
1949
iallocatorModeNodeEvac = Types.iAllocatorModeToRaw IAllocatorNodeEvac
1950

    
1951
iallocatorModeReloc :: String
1952
iallocatorModeReloc = Types.iAllocatorModeToRaw IAllocatorReloc
1953

    
1954
validIallocatorModes :: FrozenSet String
1955
validIallocatorModes =
1956
  ConstantUtils.mkSet $ map Types.iAllocatorModeToRaw [minBound..]
1957

    
1958
iallocatorSearchPath :: [String]
1959
iallocatorSearchPath = AutoConf.iallocatorSearchPath
1960

    
1961
defaultIallocatorShortcut :: String
1962
defaultIallocatorShortcut = "."
1963

    
1964
-- * Node evacuation
1965

    
1966
nodeEvacPri :: String
1967
nodeEvacPri = Types.evacModeToRaw ChangePrimary
1968

    
1969
nodeEvacSec :: String
1970
nodeEvacSec = Types.evacModeToRaw ChangeSecondary
1971

    
1972
nodeEvacAll :: String
1973
nodeEvacAll = Types.evacModeToRaw ChangeAll
1974

    
1975
nodeEvacModes :: FrozenSet String
1976
nodeEvacModes = ConstantUtils.mkSet $ map Types.evacModeToRaw [minBound..]
1977

    
1978
-- * Job status
1979

    
1980
jobStatusQueued :: String
1981
jobStatusQueued = Types.jobStatusToRaw JOB_STATUS_QUEUED
1982

    
1983
jobStatusWaiting :: String
1984
jobStatusWaiting = Types.jobStatusToRaw JOB_STATUS_WAITING
1985

    
1986
jobStatusCanceling :: String
1987
jobStatusCanceling = Types.jobStatusToRaw JOB_STATUS_CANCELING
1988

    
1989
jobStatusRunning :: String
1990
jobStatusRunning = Types.jobStatusToRaw JOB_STATUS_RUNNING
1991

    
1992
jobStatusCanceled :: String
1993
jobStatusCanceled = Types.jobStatusToRaw JOB_STATUS_CANCELED
1994

    
1995
jobStatusSuccess :: String
1996
jobStatusSuccess = Types.jobStatusToRaw JOB_STATUS_SUCCESS
1997

    
1998
jobStatusError :: String
1999
jobStatusError = Types.jobStatusToRaw JOB_STATUS_ERROR
2000

    
2001
jobsPending :: FrozenSet String
2002
jobsPending =
2003
  ConstantUtils.mkSet [jobStatusQueued, jobStatusWaiting, jobStatusCanceling]
2004

    
2005
jobsFinalized :: FrozenSet String
2006
jobsFinalized =
2007
  ConstantUtils.mkSet $ map Types.finalizedJobStatusToRaw [minBound..]
2008

    
2009
jobStatusAll :: FrozenSet String
2010
jobStatusAll = ConstantUtils.mkSet $ map Types.jobStatusToRaw [minBound..]
2011

    
2012
-- * OpCode status
2013

    
2014
-- ** Not yet finalized opcodes
2015

    
2016
opStatusCanceling :: String
2017
opStatusCanceling = "canceling"
2018

    
2019
opStatusQueued :: String
2020
opStatusQueued = "queued"
2021

    
2022
opStatusRunning :: String
2023
opStatusRunning = "running"
2024

    
2025
opStatusWaiting :: String
2026
opStatusWaiting = "waiting"
2027

    
2028
-- ** Finalized opcodes
2029

    
2030
opStatusCanceled :: String
2031
opStatusCanceled = "canceled"
2032

    
2033
opStatusError :: String
2034
opStatusError = "error"
2035

    
2036
opStatusSuccess :: String
2037
opStatusSuccess = "success"
2038

    
2039
opsFinalized :: FrozenSet String
2040
opsFinalized =
2041
  ConstantUtils.mkSet [opStatusCanceled, opStatusError, opStatusSuccess]
2042

    
2043
-- * OpCode priority
2044

    
2045
opPrioLowest :: Int
2046
opPrioLowest = 19
2047

    
2048
opPrioHighest :: Int
2049
opPrioHighest = -20
2050

    
2051
opPrioLow :: Int
2052
opPrioLow = Types.opSubmitPriorityToRaw OpPrioLow
2053

    
2054
opPrioNormal :: Int
2055
opPrioNormal = Types.opSubmitPriorityToRaw OpPrioNormal
2056

    
2057
opPrioHigh :: Int
2058
opPrioHigh = Types.opSubmitPriorityToRaw OpPrioHigh
2059

    
2060
opPrioSubmitValid :: FrozenSet Int
2061
opPrioSubmitValid = ConstantUtils.mkSet [opPrioLow, opPrioNormal, opPrioHigh]
2062

    
2063
opPrioDefault :: Int
2064
opPrioDefault = opPrioNormal
2065

    
2066
-- * Execution log types
2067

    
2068
elogMessage :: String
2069
elogMessage = Types.eLogTypeToRaw ELogMessage
2070

    
2071
elogRemoteImport :: String
2072
elogRemoteImport = Types.eLogTypeToRaw ELogRemoteImport
2073

    
2074
elogJqueueTest :: String
2075
elogJqueueTest = Types.eLogTypeToRaw ELogJqueueTest
2076

    
2077
-- * Confd
2078

    
2079
confdProtocolVersion :: Int
2080
confdProtocolVersion = ConstantUtils.confdProtocolVersion
2081

    
2082
-- Confd request type
2083

    
2084
confdReqPing :: Int
2085
confdReqPing = Types.confdRequestTypeToRaw ReqPing
2086

    
2087
confdReqNodeRoleByname :: Int
2088
confdReqNodeRoleByname = Types.confdRequestTypeToRaw ReqNodeRoleByName
2089

    
2090
confdReqNodePipByInstanceIp :: Int
2091
confdReqNodePipByInstanceIp = Types.confdRequestTypeToRaw ReqNodePipByInstPip
2092

    
2093
confdReqClusterMaster :: Int
2094
confdReqClusterMaster = Types.confdRequestTypeToRaw ReqClusterMaster
2095

    
2096
confdReqNodePipList :: Int
2097
confdReqNodePipList = Types.confdRequestTypeToRaw ReqNodePipList
2098

    
2099
confdReqMcPipList :: Int
2100
confdReqMcPipList = Types.confdRequestTypeToRaw ReqMcPipList
2101

    
2102
confdReqInstancesIpsList :: Int
2103
confdReqInstancesIpsList = Types.confdRequestTypeToRaw ReqInstIpsList
2104

    
2105
confdReqNodeDrbd :: Int
2106
confdReqNodeDrbd = Types.confdRequestTypeToRaw ReqNodeDrbd
2107

    
2108
confdReqNodeInstances :: Int
2109
confdReqNodeInstances = Types.confdRequestTypeToRaw ReqNodeInstances
2110

    
2111
confdReqs :: FrozenSet Int
2112
confdReqs =
2113
  ConstantUtils.mkSet .
2114
  map Types.confdRequestTypeToRaw $
2115
  [minBound..] \\ [ReqNodeInstances]
2116

    
2117
-- * Confd request type
2118

    
2119
confdReqfieldName :: Int
2120
confdReqfieldName = Types.confdReqFieldToRaw ReqFieldName
2121

    
2122
confdReqfieldIp :: Int
2123
confdReqfieldIp = Types.confdReqFieldToRaw ReqFieldIp
2124

    
2125
confdReqfieldMnodePip :: Int
2126
confdReqfieldMnodePip = Types.confdReqFieldToRaw ReqFieldMNodePip
2127

    
2128
-- * Confd repl status
2129

    
2130
confdReplStatusOk :: Int
2131
confdReplStatusOk = Types.confdReplyStatusToRaw ReplyStatusOk
2132

    
2133
confdReplStatusError :: Int
2134
confdReplStatusError = Types.confdReplyStatusToRaw ReplyStatusError
2135

    
2136
confdReplStatusNotimplemented :: Int
2137
confdReplStatusNotimplemented = Types.confdReplyStatusToRaw ReplyStatusNotImpl
2138

    
2139
confdReplStatuses :: FrozenSet Int
2140
confdReplStatuses =
2141
  ConstantUtils.mkSet $ map Types.confdReplyStatusToRaw [minBound..]
2142

    
2143
-- * Confd node role
2144

    
2145
confdNodeRoleMaster :: Int
2146
confdNodeRoleMaster = Types.confdNodeRoleToRaw NodeRoleMaster
2147

    
2148
confdNodeRoleCandidate :: Int
2149
confdNodeRoleCandidate = Types.confdNodeRoleToRaw NodeRoleCandidate
2150

    
2151
confdNodeRoleOffline :: Int
2152
confdNodeRoleOffline = Types.confdNodeRoleToRaw NodeRoleOffline
2153

    
2154
confdNodeRoleDrained :: Int
2155
confdNodeRoleDrained = Types.confdNodeRoleToRaw NodeRoleDrained
2156

    
2157
confdNodeRoleRegular :: Int
2158
confdNodeRoleRegular = Types.confdNodeRoleToRaw NodeRoleRegular
2159

    
2160
-- * A few common errors for confd
2161

    
2162
confdErrorUnknownEntry :: Int
2163
confdErrorUnknownEntry = Types.confdErrorTypeToRaw ConfdErrorUnknownEntry
2164

    
2165
confdErrorInternal :: Int
2166
confdErrorInternal = Types.confdErrorTypeToRaw ConfdErrorInternal
2167

    
2168
confdErrorArgument :: Int
2169
confdErrorArgument = Types.confdErrorTypeToRaw ConfdErrorArgument
2170

    
2171
-- * Confd request query fields
2172

    
2173
confdReqqLink :: String
2174
confdReqqLink = ConstantUtils.confdReqqLink
2175

    
2176
confdReqqIp :: String
2177
confdReqqIp = ConstantUtils.confdReqqIp
2178

    
2179
confdReqqIplist :: String
2180
confdReqqIplist = ConstantUtils.confdReqqIplist
2181

    
2182
confdReqqFields :: String
2183
confdReqqFields = ConstantUtils.confdReqqFields
2184

    
2185
-- | Each request is "salted" by the current timestamp.
2186
--
2187
-- This constant decides how many seconds of skew to accept.
2188
--
2189
-- TODO: make this a default and allow the value to be more
2190
-- configurable
2191
confdMaxClockSkew :: Int
2192
confdMaxClockSkew = 2 * nodeMaxClockSkew
2193

    
2194
-- | When we haven't reloaded the config for more than this amount of
2195
-- seconds, we force a test to see if inotify is betraying us. Using a
2196
-- prime number to ensure we get less chance of 'same wakeup' with
2197
-- other processes.
2198
confdConfigReloadTimeout :: Int
2199
confdConfigReloadTimeout = 17
2200

    
2201
-- | If we receive more than one update in this amount of
2202
-- microseconds, we move to polling every RATELIMIT seconds, rather
2203
-- than relying on inotify, to be able to serve more requests.
2204
confdConfigReloadRatelimit :: Int
2205
confdConfigReloadRatelimit = 250000
2206

    
2207
-- | Magic number prepended to all confd queries.
2208
--
2209
-- This allows us to distinguish different types of confd protocols
2210
-- and handle them. For example by changing this we can move the whole
2211
-- payload to be compressed, or move away from json.
2212
confdMagicFourcc :: String
2213
confdMagicFourcc = "plj0"
2214

    
2215
-- | By default a confd request is sent to the minimum between this
2216
-- number and all MCs. 6 was chosen because even in the case of a
2217
-- disastrous 50% response rate, we should have enough answers to be
2218
-- able to compare more than one.
2219
confdDefaultReqCoverage :: Int
2220
confdDefaultReqCoverage = 6
2221

    
2222
-- | Timeout in seconds to expire pending query request in the confd
2223
-- client library. We don't actually expect any answer more than 10
2224
-- seconds after we sent a request.
2225
confdClientExpireTimeout :: Int
2226
confdClientExpireTimeout = 10
2227

    
2228
-- * Possible values for NodeGroup.alloc_policy
2229

    
2230
allocPolicyLastResort :: String
2231
allocPolicyLastResort = Types.allocPolicyToRaw AllocLastResort
2232

    
2233
allocPolicyPreferred :: String
2234
allocPolicyPreferred = Types.allocPolicyToRaw AllocPreferred
2235

    
2236
allocPolicyUnallocable :: String
2237
allocPolicyUnallocable = Types.allocPolicyToRaw AllocUnallocable
2238

    
2239
validAllocPolicies :: [String]
2240
validAllocPolicies = map Types.allocPolicyToRaw [minBound..]
2241

    
2242
-- | Temporary external/shared storage parameters
2243
blockdevDriverManual :: String
2244
blockdevDriverManual = Types.blockDriverToRaw BlockDrvManual
2245

    
2246
-- | 'qemu-img' path, required for 'ovfconverter'
2247
qemuimgPath :: String
2248
qemuimgPath = AutoConf.qemuimgPath
2249

    
2250
-- | Whether htools was enabled at compilation time
2251
--
2252
-- FIXME: this should be moved next to the other enable constants,
2253
-- such as, 'enableConfd', and renamed to 'enableHtools'.
2254
htools :: Bool
2255
htools = AutoConf.htools
2256

    
2257
-- * Key files for SSH daemon
2258

    
2259
sshHostDsaPriv :: String
2260
sshHostDsaPriv = sshConfigDir ++ "/ssh_host_dsa_key"
2261

    
2262
sshHostDsaPub :: String
2263
sshHostDsaPub = sshHostDsaPriv ++ ".pub"
2264

    
2265
sshHostRsaPriv :: String
2266
sshHostRsaPriv = sshConfigDir ++ "/ssh_host_rsa_key"
2267

    
2268
sshHostRsaPub :: String
2269
sshHostRsaPub = sshHostRsaPriv ++ ".pub"
2270

    
2271
-- | Path generating random UUID
2272
randomUuidFile :: String
2273
randomUuidFile = ConstantUtils.randomUuidFile
2274

    
2275
-- * Auto-repair tag prefixes
2276

    
2277
autoRepairTagPrefix :: String
2278
autoRepairTagPrefix = "ganeti:watcher:autorepair:"
2279

    
2280
autoRepairTagEnabled :: String
2281
autoRepairTagEnabled = autoRepairTagPrefix
2282

    
2283
autoRepairTagPending :: String
2284
autoRepairTagPending = autoRepairTagPrefix ++ "pending:"
2285

    
2286
autoRepairTagResult :: String
2287
autoRepairTagResult = autoRepairTagPrefix ++ "result:"
2288

    
2289
autoRepairTagSuspended :: String
2290
autoRepairTagSuspended = autoRepairTagPrefix ++ "suspend:"
2291

    
2292
-- * Auto-repair levels
2293

    
2294
autoRepairFailover :: String
2295
autoRepairFailover = "failover"
2296

    
2297
autoRepairFixStorage :: String
2298
autoRepairFixStorage = "fix-storage"
2299

    
2300
autoRepairMigrate :: String
2301
autoRepairMigrate = "migrate"
2302

    
2303
autoRepairReinstall :: String
2304
autoRepairReinstall = "reinstall"
2305

    
2306
autoRepairAllTypes :: FrozenSet String
2307
autoRepairAllTypes =
2308
  ConstantUtils.mkSet [autoRepairFailover,
2309
                       autoRepairFixStorage,
2310
                       autoRepairMigrate,
2311
                       autoRepairReinstall]
2312

    
2313
-- * Auto-repair results
2314

    
2315
autoRepairEnoperm :: String
2316
autoRepairEnoperm = "enoperm"
2317

    
2318
autoRepairFailure :: String
2319
autoRepairFailure = "failure"
2320

    
2321
autoRepairSuccess :: String
2322
autoRepairSuccess = "success"
2323

    
2324
autoRepairAllResults :: FrozenSet String
2325
autoRepairAllResults =
2326
  ConstantUtils.mkSet [autoRepairEnoperm, autoRepairFailure, autoRepairSuccess]
2327

    
2328
-- | The version identifier for builtin data collectors
2329
builtinDataCollectorVersion :: String
2330
builtinDataCollectorVersion = "B"
2331

    
2332
-- | The reason trail opcode parameter name
2333
opcodeReason :: String
2334
opcodeReason = "reason"
2335

    
2336
diskstatsFile :: String
2337
diskstatsFile = "/proc/diskstats"
2338

    
2339
-- *  CPU load collector
2340

    
2341
statFile :: String
2342
statFile = "/proc/stat"
2343

    
2344
cpuavgloadBufferSize :: Int
2345
cpuavgloadBufferSize = 150
2346

    
2347
cpuavgloadWindowSize :: Int
2348
cpuavgloadWindowSize = 600
2349

    
2350
-- | Mond's variable for periodical data collection
2351
mondTimeInterval :: Int
2352
mondTimeInterval = 5
2353

    
2354
-- * Disk access modes
2355

    
2356
diskUserspace :: String
2357
diskUserspace = Types.diskAccessModeToRaw DiskUserspace
2358

    
2359
diskKernelspace :: String
2360
diskKernelspace = Types.diskAccessModeToRaw DiskKernelspace
2361

    
2362
diskValidAccessModes :: FrozenSet String
2363
diskValidAccessModes =
2364
  ConstantUtils.mkSet $ map Types.diskAccessModeToRaw [minBound..]
2365

    
2366
-- | Timeout for queue draining in upgrades
2367
upgradeQueueDrainTimeout :: Int
2368
upgradeQueueDrainTimeout = 36 * 60 * 60 -- 1.5 days
2369

    
2370
-- | Intervall at which the queue is polled during upgrades
2371
upgradeQueuePollInterval :: Int
2372
upgradeQueuePollInterval  = 10