├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── c ├── Makefile └── run-in-mntns.c ├── cmd ├── ami-publisher │ ├── addVolumes.go │ ├── copyBootstrapImage.go │ ├── debug.go │ ├── delete.go │ ├── deleteTags.go │ ├── expire.go │ ├── importKeyPair.go │ ├── launchInstances.go │ ├── listImages.go │ ├── listStreams.go │ ├── listUnpackers.go │ ├── main.go │ ├── prepareUnpackers.go │ ├── publish.go │ ├── removeUnusedVolumes.go │ ├── setExclusiveTags.go │ ├── setTags.go │ ├── startInstances.go │ ├── stopIdleUnpackers.go │ ├── terminateInstances.go │ ├── unusedImages.go │ └── usedImages.go ├── builder-tool │ ├── buildImage.go │ ├── buildRaw.go │ ├── main.go │ ├── manifest.go │ └── stub.go ├── dominator │ ├── README.md │ ├── health-check.yml │ ├── install │ ├── main.go │ └── required-methods ├── domtool │ ├── README.md │ ├── clearSafetyShutoff.go │ ├── configureSubs.go │ ├── disableUpdates.go │ ├── enableUpdates.go │ ├── getDefaultImage.go │ ├── getSubsConfiguration.go │ ├── main.go │ └── setDefaultImage.go ├── filegen-client │ ├── README.md │ └── main.go ├── filegen-server │ ├── README.md │ ├── health-check.yml │ ├── install │ ├── main.go │ └── register.go ├── fleet-manager │ ├── README.md │ ├── example-topology │ │ ├── NYC │ │ │ ├── rack0 │ │ │ │ ├── machines.json │ │ │ │ └── subnets.json │ │ │ ├── rack1 │ │ │ │ ├── machines.json │ │ │ │ └── subnets.json │ │ │ └── subnets.json │ │ ├── README.md │ │ ├── SJC │ │ │ ├── rack0 │ │ │ │ ├── machines.json │ │ │ │ └── subnets.json │ │ │ ├── rack1 │ │ │ │ ├── machines.json │ │ │ │ └── subnets.json │ │ │ └── subnets.json │ │ └── SYD │ │ │ ├── rack0 │ │ │ └── machines.json │ │ │ ├── rack1 │ │ │ └── machines.json │ │ │ └── subnets.json │ ├── health-check.yml │ ├── main.go │ └── required-methods ├── fs2objectcache │ ├── convert.go │ ├── main.go │ └── walk.go ├── fsbench │ └── main.go ├── fsreadslow │ └── main.go ├── hyper-control │ ├── README.md │ ├── addAddress.go │ ├── addSubnet.go │ ├── changeTags.go │ ├── getMachineInfo.go │ ├── getUpdates.go │ ├── installerShell.go │ ├── main.go │ ├── makeInstallerIso.go │ ├── moveIpAddress.go │ ├── netbootHost.go │ ├── netbootMachine.go │ ├── reinstall.go │ ├── removeAddress.go │ ├── removeExcessAddresses.go │ ├── rolloutImage.go │ ├── showNetworkConfiguration.go │ ├── updateNetworkConfiguration.go │ └── writeNetbootFiles.go ├── hypervisor │ ├── README.md │ ├── control.go │ ├── health-check.yml │ ├── install │ ├── main.go │ └── required-methods ├── image-unpacker │ ├── health-check.yml │ ├── install │ ├── main.go │ ├── required-methods │ └── stub.go ├── imageserver │ ├── README.md │ ├── health-check.yml │ ├── html.go │ ├── install │ ├── main.go │ └── required-methods ├── imagetool │ ├── README.md │ ├── addImageCommon.go │ ├── addImagefile.go │ ├── addImageimage.go │ ├── addImagesub.go │ ├── addReplaceImage.go │ ├── checkDirectory.go │ ├── checkImage.go │ ├── chownDirectory.go │ ├── computedFiles.go │ ├── copyImageSubcommand.go │ ├── deleteImage.go │ ├── deleteUnreferencedObjects.go │ ├── diffImages.go │ ├── estimate.go │ ├── expiration.go │ ├── findLatestImage.go │ ├── getFileInImage.go │ ├── getImage.go │ ├── getImageArchiveData.go │ ├── listDirectories.go │ ├── listImages.go │ ├── listUnreferencedObjects.go │ ├── main.go │ ├── makeDirectory.go │ ├── makeRawImage.go │ ├── matchTriggers.go │ ├── mergeFilters.go │ ├── mergeTriggers.go │ ├── showImage.go │ ├── tarImage.go │ └── testDownloadSpeed.go ├── imaginator │ ├── README.md │ ├── conf.json │ ├── example-manifests │ │ ├── dominator │ │ │ ├── computed-files │ │ │ ├── files │ │ │ │ ├── etc │ │ │ │ │ ├── dominator │ │ │ │ │ │ └── flags.default │ │ │ │ │ ├── issue.net │ │ │ │ │ ├── mdb.json │ │ │ │ │ └── systemd │ │ │ │ │ │ └── system │ │ │ │ │ │ ├── dominator.service.d │ │ │ │ │ │ └── env.conf │ │ │ │ │ │ ├── filegen-server.service.d │ │ │ │ │ │ └── env.conf │ │ │ │ │ │ └── mdbd.service.d │ │ │ │ │ │ └── env.conf │ │ │ │ └── var │ │ │ │ │ └── lib │ │ │ │ │ └── filegen-server │ │ │ │ │ ├── computed-files │ │ │ │ │ └── issue.net.template │ │ │ │ │ └── config │ │ │ ├── filter.add │ │ │ ├── manifest │ │ │ ├── package-list │ │ │ ├── scripts │ │ │ │ ├── 01_install_dominator │ │ │ │ ├── 01_install_filegen-server │ │ │ │ └── 01_install_mdbd │ │ │ └── triggers.add │ │ └── imageserver │ │ │ ├── computed-files │ │ │ ├── files │ │ │ └── etc │ │ │ │ ├── imageserver │ │ │ │ └── flags.default │ │ │ │ ├── issue.net │ │ │ │ ├── mdb.json │ │ │ │ └── systemd │ │ │ │ └── system │ │ │ │ └── imageserver.service.d │ │ │ │ └── env.conf │ │ │ ├── filter.add │ │ │ ├── manifest │ │ │ ├── package-list │ │ │ ├── scripts │ │ │ └── 01_install │ │ │ └── triggers.add │ ├── health-check.yml │ ├── install │ ├── main.go │ ├── required-methods │ ├── required-methods.slave │ ├── slaveDriver.go │ ├── streams.json │ └── stub.go ├── installer │ ├── configureLocalNetwork.go │ ├── configureNetwork.go │ ├── configureStorage.go │ ├── lib.go │ ├── main.go │ ├── make-tarball │ ├── objects.go │ ├── pty.go │ ├── required-methods │ ├── server.go │ ├── shell.go │ └── stub.go ├── logtool │ ├── main.go │ ├── remoteLog.go │ ├── setDebugLevel.go │ └── watch.go ├── mdb-relayd │ └── main.go ├── mdbd │ ├── README.md │ ├── daemon.go │ ├── generators.go │ ├── health-check.yml │ ├── httpd.go │ ├── install │ ├── loadAws.go │ ├── loadCis.go │ ├── loadDsHostFqdn.go │ ├── loadFleetManager.go │ ├── loadHypervisor.go │ ├── loadText.go │ ├── main.go │ ├── required-methods │ └── server.go ├── objecttool │ ├── addObjects.go │ ├── checkObject.go │ ├── getObject.go │ ├── getObjects.go │ ├── main.go │ └── testBandwidth.go ├── scan │ └── main.go ├── show-cert │ └── main.go ├── srpc-test │ └── main.go ├── subd │ ├── README.md │ ├── health-check.yml │ ├── install │ ├── loadConfiguration.go │ ├── main.go │ ├── required-methods │ └── vCpu.go ├── subtool │ ├── README.md │ ├── boostCpuLimit.go │ ├── cleanup.go │ ├── delete.go │ ├── fetch.go │ ├── getConfig.go │ ├── getFile.go │ ├── listMissingObjects.go │ ├── main.go │ ├── poll.go │ ├── pushFile.go │ ├── pushImage.go │ ├── pushMissingObjects.go │ ├── restartService.go │ ├── setConfig.go │ ├── showUpdateRequest.go │ └── waitForImage.go ├── unpacker-tool │ ├── addDevice.go │ ├── associate.go │ ├── exportImage.go │ ├── getStatus.go │ ├── main.go │ ├── prepareForCapture.go │ ├── prepareForCopy.go │ ├── prepareForUnpack.go │ ├── removeDevice.go │ └── unpackImage.go └── vm-control │ ├── README.md │ ├── becomePrimaryVmOwner.go │ ├── changeVmConsoleType.go │ ├── changeVmDestroyProtection.go │ ├── changeVmMigrating.go │ ├── changeVmOwnerUsers.go │ ├── changeVmTags.go │ ├── connectToVmConsole.go │ ├── connectToVmSerialPort.go │ ├── copyVm.go │ ├── createVm.go │ ├── deleteVmVolume.go │ ├── destroyVm.go │ ├── dial.go │ ├── discardVmOldImage.go │ ├── discardVmOldUserData.go │ ├── discardVmSnapshot.go │ ├── exportLocalVm.go │ ├── exportVirshVm.go │ ├── findHypervisor.go │ ├── getVmInfo.go │ ├── getVmUserData.go │ ├── getVmVolume.go │ ├── importLocalVm.go │ ├── importVirshVm.go │ ├── listHypervisors.go │ ├── listLocations.go │ ├── listVMs.go │ ├── main.go │ ├── migrateVm.go │ ├── patchVmImage.go │ ├── probeVmPort.go │ ├── replaceVmImage.go │ ├── replaceVmUserData.go │ ├── restoreVmFromSnapshot.go │ ├── restoreVmImage.go │ ├── restoreVmUserData.go │ ├── snapshotVm.go │ ├── startVm.go │ ├── stopVm.go │ ├── traceMetadata.go │ ├── variables_darwin.go │ └── variables_linux.go ├── design-docs ├── Dominator │ ├── ArchitecturalOverview.md │ ├── FactSheet.md │ └── README.md ├── MachineBirthing │ └── README.md ├── SmallStack │ └── README.md └── pictures │ ├── BirtherSystemComponents.svg │ ├── DominatorComputedFiles.svg │ ├── DominatorSystemComponents.svg │ ├── Hypervisor.svg │ ├── ImageReplication.svg │ └── SmallStackComponents.svg ├── dom ├── herd │ ├── api.go │ ├── herd.go │ ├── html.go │ ├── httpd.go │ ├── listSubs.go │ ├── mdb.go │ ├── metrics.go │ ├── showSubs.go │ ├── status.go │ ├── sub.go │ ├── subStatus.go │ └── subUpdate.go ├── images │ ├── api.go │ └── impl.go ├── lib │ ├── api.go │ ├── buildMissingLists.go │ ├── buildUpdateRequest.go │ ├── buildUpdateRequest_test.go │ └── pushObjects.go └── rpcd │ ├── api.go │ ├── clearSafetyShutoff.go │ ├── configureSubs.go │ ├── disableUpdates.go │ ├── enableUpdates.go │ ├── getDefaultImage.go │ ├── getSubsConfiguration.go │ └── setDefaultImage.go ├── fleetmanager ├── httpd │ ├── api.go │ └── status.go ├── hypervisors │ ├── api.go │ ├── dashboard.go │ ├── fsstorer │ │ ├── api.go │ │ ├── check.go │ │ ├── get.go │ │ ├── ip.go │ │ ├── load.go │ │ ├── mutate.go │ │ └── vm.go │ ├── get.go │ ├── ipmi.go │ ├── listHypervisors.go │ ├── listLocations.go │ ├── listVMs.go │ ├── monitor.go │ ├── moveIpAddresses.go │ ├── notifier.go │ ├── showHypervisor.go │ ├── start.go │ ├── status.go │ ├── subnets.go │ └── update.go ├── rpcd │ ├── api.go │ ├── changeMachineTags.go │ ├── getHypervisorForVm.go │ ├── getMachineInfo.go │ ├── getUpdates.go │ ├── html.go │ ├── listHypervisorLocations.go │ ├── listHypervisorsInLocation.go │ ├── listVMsInLocation.go │ └── moveIpAddresses.go └── topology │ ├── api.go │ ├── check.go │ ├── compare.go │ ├── compare_test.go │ ├── get.go │ ├── impl.go │ ├── list.go │ ├── read.go │ └── walk.go ├── hypervisor ├── client │ ├── api.go │ └── impl.go ├── dhcpd │ ├── api.go │ └── impl.go ├── httpd │ ├── api.go │ ├── listAvailableAddresses.go │ ├── listSubnets.go │ ├── listVMs.go │ ├── showBootLog.go │ ├── showVM.go │ └── status.go ├── manager │ ├── addressPool.go │ ├── api.go │ ├── cpu.go │ ├── html.go │ ├── memory.go │ ├── owners.go │ ├── start.go │ ├── stop.go │ ├── subnets.go │ ├── update.go │ ├── vm.go │ └── volumes.go ├── metadatad │ ├── api.go │ ├── daemons.go │ └── httpHandler.go ├── rpcd │ ├── acknowledgeVm.go │ ├── api.go │ ├── becomePrimaryVmOwner.go │ ├── changeAddressPool.go │ ├── changeOwners.go │ ├── changeVmConsoleType.go │ ├── changeVmDestroyProtection.go │ ├── changeVmOwnerUsers.go │ ├── changeVmTags.go │ ├── commitImportedVm.go │ ├── connectToVmConsole.go │ ├── connectToVmSerialPort.go │ ├── copyVm.go │ ├── createVm.go │ ├── deleteVmVolume.go │ ├── destroyVm.go │ ├── discardVmAccessToken.go │ ├── discardVmOldImage.go │ ├── discardVmOldUserData.go │ ├── discardVmSnapshot.go │ ├── exportLocalVm.go │ ├── getUpdates.go │ ├── getVmAccessToken.go │ ├── getVmInfo.go │ ├── getVmUserData.go │ ├── getVmVolume.go │ ├── html.go │ ├── importLocalVm.go │ ├── listVMs.go │ ├── listVolumeDirectories.go │ ├── migrateVm.go │ ├── netbootMachine.go │ ├── patchVmImage.go │ ├── prepareVmForMigration.go │ ├── probeVmPort.go │ ├── replaceVmImage.go │ ├── replaceVmUserData.go │ ├── restoreVmFromSnapshot.go │ ├── restoreVmImage.go │ ├── restoreVmUserData.go │ ├── snapshotVm.go │ ├── startVm.go │ ├── stopVm.go │ ├── traceVmMetadata.go │ └── updateSubnets.go └── tftpbootd │ ├── api.go │ └── impl.go ├── imagebuilder ├── builder │ ├── addImage.go │ ├── api.go │ ├── bootstrapImage.go │ ├── build.go │ ├── getLatestImage.go │ ├── html.go │ ├── image.go │ ├── load.go │ ├── processManifest.go │ ├── streams.go │ └── variables.go ├── client │ ├── api.go │ └── impl.go ├── httpd │ ├── api.go │ ├── showBuildLog.go │ ├── showImageStream.go │ ├── showImageStreams.go │ └── status.go └── rpcd │ ├── api.go │ ├── buildImage.go │ └── html.go ├── imagepublishers └── amipublisher │ ├── addVolumes.go │ ├── api.go │ ├── copyBootstrapImage.go │ ├── delete.go │ ├── expire.go │ ├── importKeyPair.go │ ├── iterators.go │ ├── launchInstances.go │ ├── libAws.go │ ├── listImages.go │ ├── listStreams.go │ ├── listUnpackers.go │ ├── marshal.go │ ├── prepareUnpackers.go │ ├── publish.go │ ├── removeUnusedVolumes.go │ ├── setExclusiveTags.go │ ├── setTags.go │ ├── startInstances.go │ ├── stopIdleUnpackers.go │ ├── terminateInstances.go │ ├── unusedImages.go │ └── usedImages.go ├── imageserver ├── client │ ├── addImage.go │ ├── api.go │ ├── checkDirectory.go │ ├── checkImage.go │ ├── chownDirectory.go │ ├── deleteImage.go │ ├── deleteUnreferencedObjects.go │ ├── expiration.go │ ├── findLatestImage.go │ ├── getImage.go │ ├── listDirectories.go │ ├── listImages.go │ ├── listUnreferencedObjects.go │ └── makeDirectory.go ├── httpd │ ├── api.go │ ├── listBuildLog.go │ ├── listComputedInodes.go │ ├── listDirectories.go │ ├── listFilter.go │ ├── listImage.go │ ├── listImages.go │ ├── listObject.go │ ├── listPackages.go │ ├── listReleaseNotes.go │ ├── listTriggers.go │ ├── showImage.go │ └── status.go ├── rpcd │ ├── addImage.go │ ├── api.go │ ├── checkDirectory.go │ ├── checkImage.go │ ├── chownDirectory.go │ ├── deleteImage.go │ ├── deleteUnreferencedObjects.go │ ├── expiration.go │ ├── findLatestImage.go │ ├── getImage.go │ ├── getImageUpdates.go │ ├── html.go │ ├── lib.go │ ├── listDirectories.go │ ├── listImages.go │ ├── listUnreferencedObjects.go │ ├── makeDirectory.go │ └── replicator.go └── scanner │ ├── api.go │ ├── expire.go │ ├── garbageCollector.go │ ├── html.go │ ├── imdb.go │ └── load.go ├── imageunpacker ├── client │ ├── addDevice.go │ ├── api.go │ └── misc.go ├── httpd │ ├── api.go │ ├── showFileSystem.go │ └── status.go ├── rpcd │ ├── addDevice.go │ ├── api.go │ ├── associateStreamWithDevice.go │ ├── exportImage.go │ ├── getStatus.go │ ├── html.go │ ├── prepareForCapture.go │ ├── prepareForCopy.go │ ├── prepareForUnpack.go │ ├── removeDevice.go │ └── unpackImage.go └── unpacker │ ├── addDevice.go │ ├── api.go │ ├── associateWithDevice.go │ ├── exportImage.go │ ├── getFileSystem.go │ ├── getStatus.go │ ├── html.go │ ├── load.go │ ├── prepareForCapture.go │ ├── prepareForCopy.go │ ├── prepareForUnpack.go │ ├── removeDevice.go │ ├── streamManager.go │ ├── unpackImage.go │ └── writeState.go ├── init.d ├── dominator.Debian-7 ├── dominator.Ubuntu-12.04 ├── dominator.Ubuntu-14.04 ├── dominator.service ├── filegen-server.Debian-7 ├── filegen-server.Ubuntu-12.04 ├── filegen-server.Ubuntu-14.04 ├── filegen-server.service ├── fleet-manager.Debian-7 ├── fleet-manager.Ubuntu-12.04 ├── fleet-manager.Ubuntu-14.04 ├── fleet-manager.Ubuntu-16.04 ├── fleet-manager.service ├── hypervisor.Debian-7 ├── hypervisor.Ubuntu-14.04 ├── hypervisor.Ubuntu-16.04 ├── hypervisor.service ├── image-unpacker.Debian-7 ├── image-unpacker.Ubuntu-12.04 ├── image-unpacker.Ubuntu-14.04 ├── image-unpacker.service ├── imageserver.Debian-7 ├── imageserver.Ubuntu-12.04 ├── imageserver.Ubuntu-14.04 ├── imageserver.service ├── imaginator.Debian-7 ├── imaginator.Ubuntu-12.04 ├── imaginator.Ubuntu-14.04 ├── imaginator.Ubuntu-16.04 ├── imaginator.service ├── mdbd.Debian-7 ├── mdbd.Ubuntu-12.04 ├── mdbd.Ubuntu-14.04 ├── mdbd.service ├── subd.CentOS-6 ├── subd.Debian-7 ├── subd.Ubuntu-12.04 ├── subd.Ubuntu-14.04 ├── subd.service └── virtual-machines.service ├── lib ├── awsutil │ ├── accounts.go │ ├── api.go │ ├── credentials.go │ ├── flag.go │ ├── iterators.go │ ├── regions.go │ └── tags.go ├── bufwriter │ ├── api.go │ └── impl.go ├── concurrent │ ├── api.go │ ├── impl.go │ └── incrementer.go ├── configwatch │ ├── api.go │ └── impl.go ├── connpool │ ├── api.go │ ├── conn.go │ ├── pool.go │ └── usage_test.go ├── constants │ └── constants.go ├── cpulimiter │ ├── api.go │ └── limiter.go ├── cpusharer │ ├── api.go │ ├── fifo.go │ └── lib.go ├── errors │ └── api.go ├── filegen │ ├── api.go │ ├── client │ │ ├── api.go │ │ ├── machine.go │ │ └── manager.go │ ├── connect.go │ ├── file.go │ ├── html.go │ ├── httpd │ │ ├── api.go │ │ ├── listGenerators.go │ │ └── status.go │ ├── manager.go │ ├── mdb.go │ ├── register.go │ ├── template.go │ └── util │ │ ├── api.go │ │ └── load.go ├── filesystem │ ├── api.go │ ├── compare.go │ ├── encoding.go │ ├── estimate.go │ ├── filter.go │ ├── get.go │ ├── iterators.go │ ├── list.go │ ├── rebuild.go │ ├── scanner │ │ ├── api.go │ │ ├── getObject.go │ │ └── walk.go │ ├── tar │ │ ├── api.go │ │ ├── encode.go │ │ └── write.go │ ├── untar │ │ ├── api.go │ │ ├── decode.go │ │ └── sort.go │ ├── util │ │ ├── api.go │ │ ├── computedFiles.go │ │ ├── copyMtimes.go │ │ ├── filter.go │ │ ├── replaceComputedFiles.go │ │ ├── unpack.go │ │ └── writeRaw.go │ └── write.go ├── filter │ ├── api.go │ ├── filter.go │ ├── match_test.go │ └── merge.go ├── flags │ └── loadflags │ │ ├── api.go │ │ └── impl.go ├── flagutil │ ├── api.go │ ├── size.go │ ├── stringList.go │ └── stringToRuneMap.go ├── format │ ├── api.go │ └── format.go ├── fsbench │ ├── fsbench.go │ ├── odirect_linux.go │ └── stubs.go ├── fsrateio │ ├── api.go │ └── reader.go ├── fsutil │ ├── api.go │ ├── checksummer.go │ ├── compare.go │ ├── copy.go │ ├── fallocate.go │ ├── force.go │ ├── load.go │ ├── loopback.go │ ├── makeMutable.go │ ├── readDirnames.go │ ├── renamingWriter.go │ ├── update.go │ ├── waitFile.go │ ├── waitFile_test.go │ ├── watchFile.go │ ├── watchFileWithFsNotifyStub.go │ ├── watchFile_linux.go │ └── watchFile_test.go ├── hash │ ├── api.go │ └── marshal.go ├── html │ ├── api.go │ ├── benchmark.go │ ├── footer.go │ ├── header.go │ └── register.go ├── image │ ├── api.go │ ├── getMissingObjects.go │ ├── iterators.go │ ├── list.go │ ├── replace.go │ ├── sort.go │ └── verify.go ├── json │ ├── api.go │ ├── read.go │ └── write.go ├── log │ ├── api.go │ ├── cmdlogger │ │ ├── api.go │ │ └── impl.go │ ├── debuglogger │ │ └── api.go │ ├── logutil │ │ ├── api.go │ │ └── impl.go │ ├── nulllogger │ │ └── api.go │ ├── prefixlogger │ │ └── api.go │ ├── serverlogger │ │ ├── api.go │ │ └── impl.go │ ├── teelogger │ │ └── api.go │ └── testlogger │ │ └── api.go ├── logbuf │ ├── api.go │ ├── http.go │ └── impl.go ├── mbr │ ├── api.go │ ├── impl.go │ └── tableType.go ├── mdb │ ├── api.go │ ├── compare.go │ ├── compare_test.go │ ├── debug.go │ ├── mdbd │ │ ├── api.go │ │ ├── metrics.go │ │ └── watchd.go │ ├── updateFrom.go │ └── updateFrom_test.go ├── meminfo │ ├── api.go │ ├── getMemInfo_linux.go │ └── stubs.go ├── memstats │ └── memstats.go ├── net │ ├── api.go │ ├── bind.go │ ├── configurator │ │ ├── api.go │ │ ├── compute.go │ │ ├── debian.go │ │ ├── resolvConf.go │ │ └── update.go │ ├── cpuSharingDialer.go │ ├── createTapDevice.go │ ├── createTapDevice_linux.go │ ├── getBridgeVlanId.go │ ├── listBroadcastInterfaces.go │ ├── measuringDialer.go │ ├── proxy │ │ ├── api.go │ │ ├── common.go │ │ └── socks.go │ ├── reverseconnection │ │ ├── api.go │ │ ├── common.go │ │ ├── dialer.go │ │ ├── listen_test.go │ │ └── listener.go │ ├── rpc │ │ ├── api.go │ │ └── rpc.go │ ├── rrdialer │ │ ├── api.go │ │ ├── dial_test.go │ │ └── impl.go │ ├── tcpsockopt_darwin.go │ ├── tcpsockopt_unix.go │ ├── terminal │ │ └── client │ │ │ ├── api.go │ │ │ └── impl.go │ ├── testCarrier.go │ ├── tls │ │ ├── api.go │ │ ├── dial_test.go │ │ └── impl.go │ └── util │ │ ├── api.go │ │ ├── getDefaultRoute.go │ │ ├── getMyIP.go │ │ └── getResolverConfiguration.go ├── netspeed │ ├── api.go │ └── impl.go ├── objectcache │ ├── api.go │ ├── compare.go │ ├── encoding.go │ ├── filename.go │ ├── mapToCache.go │ ├── read.go │ └── walk.go ├── objectserver │ ├── api.go │ ├── cachingreader │ │ ├── api.go │ │ ├── get.go │ │ ├── html.go │ │ ├── link.go │ │ ├── lru.go │ │ └── new.go │ ├── client │ │ ├── addObject.go │ │ ├── api.go │ │ ├── checkObjects.go │ │ ├── client.go │ │ ├── getObjects.go │ │ └── queue.go │ ├── filesystem │ │ ├── add.go │ │ ├── api.go │ │ ├── check.go │ │ ├── delete.go │ │ ├── garbageCollector.go │ │ ├── get.go │ │ ├── html.go │ │ ├── list.go │ │ ├── new.go │ │ ├── scan │ │ │ ├── api.go │ │ │ └── scan.go │ │ └── stash.go │ ├── lib.go │ └── memory │ │ ├── add.go │ │ ├── api.go │ │ ├── check.go │ │ ├── get.go │ │ ├── list.go │ │ └── new.go ├── pprof │ ├── api.go │ └── impl.go ├── queue │ ├── api.go │ ├── dataQueue.go │ └── eventQueue.go ├── rateio │ ├── api.go │ ├── metrics.go │ └── reader.go ├── resourcepool │ ├── api.go │ ├── impl.go │ ├── locking_test.go │ └── metrics.go ├── rpcclientpool │ ├── api.go │ ├── impl.go │ └── usage_test.go ├── rsync │ ├── api.go │ ├── getBlocks.go │ └── serveBlocks.go ├── slavedriver │ ├── api.go │ ├── impl.go │ └── smallstack │ │ ├── api.go │ │ └── impl.go ├── srpc │ ├── api.go │ ├── call_test.go │ ├── client.go │ ├── clientProxy.go │ ├── coders.go │ ├── connection.go │ ├── load.go │ ├── managed.go │ ├── proxy │ │ ├── api.go │ │ └── impl.go │ ├── server.go │ ├── serverutil │ │ ├── api.go │ │ └── perUserMethodLimiter.go │ ├── setupclient │ │ ├── api.go │ │ └── impl.go │ └── setupserver │ │ ├── api.go │ │ └── impl.go ├── stringutil │ ├── api.go │ └── dedup.go ├── tags │ ├── api.go │ └── tags.go ├── triggers │ ├── api.go │ ├── load.go │ ├── make.go │ ├── match.go │ ├── merge.go │ └── replace.go ├── url │ ├── api.go │ ├── last.go │ ├── parseQuery.go │ ├── parsedQuery.go │ └── urlutil │ │ ├── api.go │ │ ├── open.go │ │ ├── watchUrl.go │ │ └── watchUrlCached.go ├── verstr │ ├── api.go │ ├── less.go │ ├── less_test.go │ └── sort.go ├── wsyscall │ ├── api.go │ ├── wrappers_darwin.go │ ├── wrappers_linux.go │ └── wrappers_windows.go └── x509util │ ├── api.go │ ├── getPermittedMethods.go │ └── getUsername.go ├── objectserver └── rpcd │ ├── addObjects.go │ ├── api.go │ ├── checkObjects.go │ ├── getObjects.go │ ├── html.go │ ├── lib │ ├── addObjects.go │ ├── addObjectsWithMaster.go │ └── api.go │ └── testBandwidth.go ├── proto ├── common │ └── messages.go ├── dominator │ └── messages.go ├── filegenerator │ └── messages.go ├── fleetmanager │ ├── messages.go │ └── methods.go ├── hypervisor │ ├── messages.go │ └── methods.go ├── imageserver │ ├── gob.go │ └── messages.go ├── imageunpacker │ ├── messages.go │ └── string.go ├── imaginator │ └── messages.go ├── installer │ └── messages.go ├── logger │ └── messages.go ├── mdbserver │ └── messages.go ├── objectserver │ └── messages.go ├── proxy │ └── messages.go ├── rsync │ └── messages.go ├── sub │ ├── gob.go │ ├── messages.go │ └── string.go └── test │ └── messages.go ├── scripts ├── image-pusher │ ├── export-image │ ├── init.wrapper │ ├── push-to-importer │ ├── push-to-seed │ └── subd.default ├── install.lib ├── list-methods ├── make-cert └── make-tarball ├── sub ├── client │ ├── api.go │ ├── boostCpuLimit.go │ ├── cleanup.go │ ├── fetch.go │ ├── getConfiguration.go │ ├── getFiles.go │ ├── poll.go │ ├── setConfiguration.go │ └── update.go ├── httpd │ ├── api.go │ └── status.go ├── lib │ ├── api.go │ └── update.go ├── rpcd │ ├── addObjects.go │ ├── api.go │ ├── boostCpuLimit.go │ ├── cleanup.go │ ├── fetch.go │ ├── getConfiguration.go │ ├── getFiles.go │ ├── html.go │ ├── poll.go │ ├── setConfiguration.go │ └── update.go └── scanner │ ├── api.go │ ├── compare.go │ ├── html.go │ ├── limits.go │ ├── metrics.go │ ├── scand.go │ ├── update.go │ └── walk.go └── user-guide ├── README.md ├── getting-started.md ├── image-manifest.md └── making-images.md /.travis.yml: -------------------------------------------------------------------------------- 1 | language: go 2 | 3 | # go1.11beta1 breaks the tests for lib/net/reverseconnection 4 | go: 5 | - "1.10" 6 | 7 | before_install: 8 | - go get github.com/mattn/goveralls 9 | - REPO_NAME=$(basename $PWD) 10 | - GITHUB_PATH=$(dirname $(dirname $PWD)) 11 | - SYMANTEC_PROJECT_DIR=${GITHUB_PATH}/Symantec/${REPO_NAME} 12 | - mkdir -p ${SYMANTEC_PROJECT_DIR} 13 | - rsync -az ${TRAVIS_BUILD_DIR}/ ${SYMANTEC_PROJECT_DIR}/ 14 | - export TRAVIS_BUILD_DIR=${SYMANTEC_PROJECT_DIR} 15 | - cd ${SYMANTEC_PROJECT_DIR} 16 | - go get ./... 17 | 18 | script: 19 | - go test -covermode=count -coverprofile=coverage.out ./... 20 | - $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci 21 | - make all build-darwin test 22 | -------------------------------------------------------------------------------- /c/Makefile: -------------------------------------------------------------------------------- 1 | all: $(GOPATH)/bin/run-in-mntns 2 | 3 | $(GOPATH)/bin/run-in-mntns: run-in-mntns.c 4 | cc -static -s -o $(GOPATH)/bin/run-in-mntns run-in-mntns.c 5 | -------------------------------------------------------------------------------- /cmd/ami-publisher/addVolumes.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "strconv" 7 | 8 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func addVolumesSubcommand(args []string, logger log.DebugLogger) { 13 | if err := addVolumes(args[0], logger); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error adding volumes: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func addVolumes(sizeStr string, logger log.DebugLogger) error { 21 | sizeInGiB, err := strconv.ParseInt(sizeStr, 10, 64) 22 | if err != nil { 23 | return err 24 | } 25 | return amipublisher.AddVolumes(targets, skipTargets, tags, 26 | *instanceName, uint64(sizeInGiB)<<30, logger) 27 | } 28 | -------------------------------------------------------------------------------- /cmd/ami-publisher/debug.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "runtime" 5 | 6 | "github.com/Symantec/Dominator/lib/format" 7 | "github.com/Symantec/Dominator/lib/log" 8 | ) 9 | 10 | func logMemoryUsage(logger log.DebugLogger) { 11 | var memStats runtime.MemStats 12 | runtime.ReadMemStats(&memStats) 13 | logger.Debugf(0, "Memory: allocated: %s system: %s\n", 14 | format.FormatBytes(memStats.Alloc), 15 | format.FormatBytes(memStats.Sys)) 16 | } 17 | -------------------------------------------------------------------------------- /cmd/ami-publisher/expire.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func expireSubcommand(args []string, logger log.DebugLogger) { 12 | err := amipublisher.ExpireResources(targets, skipTargets, logger) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error expiring resources: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | -------------------------------------------------------------------------------- /cmd/ami-publisher/importKeyPair.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "os" 7 | 8 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func importKeyPairSubcommand(args []string, logger log.DebugLogger) { 13 | err := importKeyPair(args[0], args[1], logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error importing key pair: %s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | 21 | func importKeyPair(keyName string, pubKeyFilename string, 22 | logger log.DebugLogger) error { 23 | publicKey, err := ioutil.ReadFile(pubKeyFilename) 24 | if err != nil { 25 | return err 26 | } 27 | return amipublisher.ImportKeyPair(targets, skipTargets, keyName, publicKey, 28 | logger) 29 | } 30 | -------------------------------------------------------------------------------- /cmd/ami-publisher/listImages.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | libjson "github.com/Symantec/Dominator/lib/json" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func listImagesSubcommand(args []string, logger log.DebugLogger) { 13 | err := listImages(logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error listing images: %s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | 21 | func listImages(logger log.DebugLogger) error { 22 | results, err := amipublisher.ListImages(targets, skipTargets, searchTags, 23 | excludeSearchTags, *minImageAge, logger) 24 | if err != nil { 25 | return err 26 | } 27 | return libjson.WriteWithIndent(os.Stdout, " ", results) 28 | } 29 | -------------------------------------------------------------------------------- /cmd/ami-publisher/listUnpackers.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | libjson "github.com/Symantec/Dominator/lib/json" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func listUnpackersSubcommand(args []string, logger log.DebugLogger) { 13 | err := listUnpackers(logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error listing unpackers: %s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | 21 | func listUnpackers(logger log.DebugLogger) error { 22 | results, err := amipublisher.ListUnpackers(targets, skipTargets, 23 | *instanceName, logger) 24 | if err != nil { 25 | return err 26 | } 27 | return libjson.WriteWithIndent(os.Stdout, " ", results) 28 | } 29 | -------------------------------------------------------------------------------- /cmd/ami-publisher/prepareUnpackers.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "path" 7 | 8 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func prepareUnpackersSubcommand(args []string, logger log.DebugLogger) { 13 | streamName := "" 14 | if len(args) > 0 { 15 | streamName = path.Clean(args[0]) 16 | } 17 | err := amipublisher.PrepareUnpackers(streamName, targets, skipTargets, 18 | *instanceName, logger) 19 | if err != nil { 20 | fmt.Fprintf(os.Stderr, "Error preparing unpackers: %s\n", err) 21 | os.Exit(1) 22 | } 23 | os.Exit(0) 24 | } 25 | -------------------------------------------------------------------------------- /cmd/ami-publisher/removeUnusedVolumes.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func removeUnusedVolumesSubcommand(args []string, logger log.DebugLogger) { 12 | if err := removeUnusedVolumes(logger); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error removing unused volumes: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func removeUnusedVolumes(logger log.DebugLogger) error { 20 | return amipublisher.RemoveUnusedVolumes(targets, skipTargets, *instanceName, 21 | logger) 22 | } 23 | -------------------------------------------------------------------------------- /cmd/ami-publisher/setTags.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func setTagsSubcommand(args []string, logger log.DebugLogger) { 12 | if err := setTags(logger); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error setting tags: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func setTags(logger log.DebugLogger) error { 20 | return amipublisher.SetTags(targets, skipTargets, *instanceName, tags, 21 | logger) 22 | } 23 | -------------------------------------------------------------------------------- /cmd/ami-publisher/stopIdleUnpackers.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func stopIdleUnpackersSubcommand(args []string, logger log.DebugLogger) { 12 | err := amipublisher.StopIdleUnpackers(targets, skipTargets, *instanceName, 13 | *maxIdleTime, logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error stopping idle unpackers: %s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | -------------------------------------------------------------------------------- /cmd/ami-publisher/terminateInstances.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func terminateInstancesSubcommand(args []string, logger log.DebugLogger) { 12 | err := amipublisher.TerminateInstances(targets, skipTargets, *instanceName, 13 | logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error terminating instances: %s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | -------------------------------------------------------------------------------- /cmd/ami-publisher/usedImages.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imagepublishers/amipublisher" 8 | libjson "github.com/Symantec/Dominator/lib/json" 9 | "github.com/Symantec/Dominator/lib/log" 10 | ) 11 | 12 | func listUsedImagesSubcommand(args []string, logger log.DebugLogger) { 13 | err := listUsedImages(logger) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error listing used images: %s\n", err) 16 | os.Exit(1) 17 | } 18 | logMemoryUsage(logger) 19 | os.Exit(0) 20 | } 21 | 22 | func listUsedImages(logger log.DebugLogger) error { 23 | results, err := amipublisher.ListUsedImages(targets, skipTargets, 24 | searchTags, excludeSearchTags, logger) 25 | if err != nil { 26 | return err 27 | } 28 | if err := libjson.WriteWithIndent(os.Stdout, " ", results); err != nil { 29 | return err 30 | } 31 | return nil 32 | } 33 | -------------------------------------------------------------------------------- /cmd/builder-tool/stub.go: -------------------------------------------------------------------------------- 1 | // +build !linux 2 | 3 | package main 4 | 5 | import ( 6 | "os" 7 | 8 | "github.com/Symantec/Dominator/lib/log" 9 | ) 10 | 11 | func notAvailable() { 12 | os.Stderr.Write([]byte("Not available on this OS\n")) 13 | os.Exit(1) 14 | } 15 | 16 | func buildFromManifestSubcommand(args []string, logger log.DebugLogger) { 17 | notAvailable() 18 | } 19 | 20 | func buildRawFromManifestSubcommand(args []string, logger log.DebugLogger) { 21 | notAvailable() 22 | } 23 | 24 | func buildTreeFromManifestSubcommand(args []string, logger log.DebugLogger) { 25 | notAvailable() 26 | } 27 | 28 | func processManifestSubcommand(args []string, logger log.DebugLogger) { 29 | notAvailable() 30 | } 31 | -------------------------------------------------------------------------------- /cmd/dominator/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6970 7 | -------------------------------------------------------------------------------- /cmd/dominator/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all dominator 10 | -------------------------------------------------------------------------------- /cmd/dominator/required-methods: -------------------------------------------------------------------------------- 1 | FileGenerator.Connect 2 | ImageServer.GetImage 3 | ImageServer.GetImageExpiration 4 | ObjectServer.AddObjects 5 | Subd.* 6 | -------------------------------------------------------------------------------- /cmd/domtool/clearSafetyShutoff.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/dominator" 9 | ) 10 | 11 | func clearSafetyShutoffSubcommand(client *srpc.Client, args []string) { 12 | if err := clearSafetyShutoff(client, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error clearing safety shutoff: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func clearSafetyShutoff(client *srpc.Client, subHostname string) error { 20 | var request dominator.ClearSafetyShutoffRequest 21 | var reply dominator.ClearSafetyShutoffResponse 22 | request.Hostname = subHostname 23 | return client.RequestReply("Dominator.ClearSafetyShutoff", request, &reply) 24 | } 25 | -------------------------------------------------------------------------------- /cmd/domtool/configureSubs.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/dominator" 9 | ) 10 | 11 | func configureSubsSubcommand(client *srpc.Client, args []string) { 12 | if err := configureSubs(client); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error setting config for subs: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func configureSubs(client *srpc.Client) error { 20 | var request dominator.ConfigureSubsRequest 21 | var reply dominator.ConfigureSubsResponse 22 | request.CpuPercent = *cpuPercent 23 | request.NetworkSpeedPercent = *networkSpeedPercent 24 | request.ScanExclusionList = scanExcludeList 25 | request.ScanSpeedPercent = *scanSpeedPercent 26 | return client.RequestReply("Dominator.ConfigureSubs", request, &reply) 27 | } 28 | -------------------------------------------------------------------------------- /cmd/domtool/disableUpdates.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "os" 7 | 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | "github.com/Symantec/Dominator/proto/dominator" 10 | ) 11 | 12 | func disableUpdatesSubcommand(client *srpc.Client, args []string) { 13 | if err := disableUpdates(client, args[0]); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error disabling updates: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func disableUpdates(client *srpc.Client, reason string) error { 21 | if reason == "" { 22 | return errors.New("cannot disable updates: no reason given") 23 | } 24 | var request dominator.DisableUpdatesRequest 25 | var reply dominator.DisableUpdatesResponse 26 | request.Reason = reason 27 | return client.RequestReply("Dominator.DisableUpdates", request, &reply) 28 | } 29 | -------------------------------------------------------------------------------- /cmd/domtool/enableUpdates.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "os" 7 | 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | "github.com/Symantec/Dominator/proto/dominator" 10 | ) 11 | 12 | func enableUpdatesSubcommand(client *srpc.Client, args []string) { 13 | if err := enableUpdates(client, args[0]); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error enabling updates: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func enableUpdates(client *srpc.Client, reason string) error { 21 | if reason == "" { 22 | return errors.New("cannot enable updates: no reason given") 23 | } 24 | var request dominator.EnableUpdatesRequest 25 | var reply dominator.EnableUpdatesResponse 26 | request.Reason = reason 27 | return client.RequestReply("Dominator.EnableUpdates", request, &reply) 28 | } 29 | -------------------------------------------------------------------------------- /cmd/domtool/getDefaultImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/dominator" 9 | ) 10 | 11 | func getDefaultImageSubcommand(client *srpc.Client, args []string) { 12 | if err := getDefaultImage(client); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error getting default image: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func getDefaultImage(client *srpc.Client) error { 20 | var request dominator.GetDefaultImageRequest 21 | var reply dominator.GetDefaultImageResponse 22 | if err := client.RequestReply("Dominator.GetDefaultImage", request, 23 | &reply); err != nil { 24 | return err 25 | } 26 | if reply.ImageName != "" { 27 | fmt.Println(reply.ImageName) 28 | } 29 | return nil 30 | } 31 | -------------------------------------------------------------------------------- /cmd/domtool/getSubsConfiguration.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/dominator" 9 | "github.com/Symantec/Dominator/proto/sub" 10 | ) 11 | 12 | func getSubsConfigurationSubcommand(client *srpc.Client, args []string) { 13 | if err := getSubsConfiguration(client); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error getting config for subs: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func getSubsConfiguration(client *srpc.Client) error { 21 | var request dominator.GetSubsConfigurationRequest 22 | var reply dominator.GetSubsConfigurationResponse 23 | if err := client.RequestReply("Dominator.GetSubsConfiguration", request, 24 | &reply); err != nil { 25 | return err 26 | } 27 | fmt.Println(sub.Configuration(reply)) 28 | return nil 29 | } 30 | -------------------------------------------------------------------------------- /cmd/domtool/setDefaultImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/dominator" 9 | ) 10 | 11 | func setDefaultImageSubcommand(client *srpc.Client, args []string) { 12 | if err := setDefaultImage(client, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error setting default image: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func setDefaultImage(client *srpc.Client, imageName string) error { 20 | var request dominator.SetDefaultImageRequest 21 | var reply dominator.SetDefaultImageResponse 22 | request.ImageName = imageName 23 | if err := client.RequestReply("Dominator.SetDefaultImage", request, 24 | &reply); err != nil { 25 | return err 26 | } 27 | return nil 28 | } 29 | -------------------------------------------------------------------------------- /cmd/filegen-server/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6972 7 | -------------------------------------------------------------------------------- /cmd/filegen-server/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all filegen-server 10 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/NYC/rack0/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Production", 4 | "IpGateway": "10.0.0.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "nyc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.0.2", 9 | "172.16.0.3" 10 | ], 11 | "VlanId": 10 12 | }, 13 | { 14 | "Id": "Infrastructure", 15 | "IpGateway": "172.16.0.1", 16 | "IpMask": "255.255.255.0", 17 | "DomainName": "nyc.prod.company.com", 18 | "DomainNameServers": [ 19 | "172.16.0.2", 20 | "172.16.0.3" 21 | ], 22 | "VlanId": 20 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/NYC/rack1/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Production", 4 | "IpGateway": "10.0.1.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "nyc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.0.2", 9 | "172.16.0.3" 10 | ], 11 | "VlanId": 10 12 | }, 13 | { 14 | "Id": "Infrastructure", 15 | "IpGateway": "172.16.1.1", 16 | "IpMask": "255.255.255.0", 17 | "DomainName": "nyc.prod.company.com", 18 | "DomainNameServers": [ 19 | "172.16.0.2", 20 | "172.16.0.3" 21 | ], 22 | "VlanId": 20 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/NYC/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Egress", 4 | "IpGateway": "192.168.0.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "nyc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.0.2", 9 | "172.16.0.3" 10 | ], 11 | "VlanId": 30 12 | } 13 | ] 14 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/README.md: -------------------------------------------------------------------------------- 1 | # Example topology for Fleet Manager 2 | 3 | This example toplogy contains 2 large regions (NYC and SJC) and a small region 4 | (SYD). Each region has 3 VLANS: 5 | - `Production`: for products serving customers 6 | - `Infrastructure`: for internal infrastructure services 7 | - `Egress`: for VMs which have Internet egress access via a NAT gateway 8 | 9 | While the large regions have the `Production` and `Infrastructure` subnets 10 | segmented per rack, the smaller SYD region has all subnets covering the entire 11 | region. 12 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/SJC/rack0/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Production", 4 | "IpGateway": "10.10.0.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "sjc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.10.2", 9 | "172.16.10.3" 10 | ], 11 | "VlanId": 10 12 | }, 13 | { 14 | "Id": "Infrastructure", 15 | "IpGateway": "172.16.10.1", 16 | "IpMask": "255.255.255.0", 17 | "DomainName": "sjc.prod.company.com", 18 | "DomainNameServers": [ 19 | "172.16.10.2", 20 | "172.16.10.3" 21 | ], 22 | "VlanId": 20 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/SJC/rack1/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Production", 4 | "IpGateway": "10.10.1.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "sjc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.10.2", 9 | "172.16.10.3" 10 | ], 11 | "VlanId": 10 12 | }, 13 | { 14 | "Id": "Infrastructure", 15 | "IpGateway": "172.16.11.1", 16 | "IpMask": "255.255.255.0", 17 | "DomainName": "sjc.prod.company.com", 18 | "DomainNameServers": [ 19 | "172.16.10.2", 20 | "172.16.10.3" 21 | ], 22 | "VlanId": 20 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/SJC/subnets.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Id": "Egress", 4 | "IpGateway": "192.168.1.1", 5 | "IpMask": "255.255.255.0", 6 | "DomainName": "sjc.prod.company.com", 7 | "DomainNameServers": [ 8 | "172.16.10.2", 9 | "172.16.10.3" 10 | ], 11 | "VlanId": 30 12 | } 13 | ] 14 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/SYD/rack0/machines.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Hostname": "row00-rack0.syd.prod.company.com" 4 | }, 5 | { 6 | "Hostname": "row01-rack0.syd.prod.company.com" 7 | }, 8 | { 9 | "Hostname": "row02-rack0.syd.prod.company.com" 10 | }, 11 | { 12 | "Hostname": "row03-rack0.syd.prod.company.com" 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /cmd/fleet-manager/example-topology/SYD/rack1/machines.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Hostname": "row00-rack1.syd.prod.company.com" 4 | }, 5 | { 6 | "Hostname": "row01-rack1.syd.prod.company.com" 7 | }, 8 | { 9 | "Hostname": "row02-rack1.syd.prod.company.com" 10 | }, 11 | { 12 | "Hostname": "row03-rack1.syd.prod.company.com" 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /cmd/fleet-manager/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6977 7 | -------------------------------------------------------------------------------- /cmd/fleet-manager/required-methods: -------------------------------------------------------------------------------- 1 | Hypervisor.* 2 | -------------------------------------------------------------------------------- /cmd/fs2objectcache/convert.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "crypto/sha512" 5 | "io" 6 | "os" 7 | "path" 8 | 9 | "github.com/Symantec/Dominator/lib/fsutil" 10 | "github.com/Symantec/Dominator/lib/hash" 11 | "github.com/Symantec/Dominator/lib/objectcache" 12 | ) 13 | 14 | func convertToObject(pathname, objectsDir string) error { 15 | file, err := os.Open(pathname) 16 | if err != nil { 17 | return err 18 | } 19 | defer file.Close() 20 | hasher := sha512.New() 21 | _, err = io.Copy(hasher, file) 22 | if err != nil { 23 | return err 24 | } 25 | var hashVal hash.Hash 26 | copy(hashVal[:], hasher.Sum(nil)) 27 | objPathname := path.Join(objectsDir, objectcache.HashToFilename(hashVal)) 28 | if err = os.MkdirAll(path.Dir(objPathname), 0755); err != nil { 29 | return err 30 | } 31 | return fsutil.ForceRename(pathname, objPathname) 32 | } 33 | -------------------------------------------------------------------------------- /cmd/fsbench/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/fsbench" 8 | ) 9 | 10 | // Benchmark the read speed of the underlying block device for a given file. 11 | func main() { 12 | pathname := "/" 13 | if len(os.Args) == 2 { 14 | pathname = os.Args[1] 15 | } 16 | bytesPerSecond, blocksPerSecond, err := fsbench.GetReadSpeed(pathname) 17 | if err != nil { 18 | fmt.Fprintf(os.Stderr, "Error! %s\n", err) 19 | return 20 | } 21 | fmt.Printf("speed=%d MiB/s ", bytesPerSecond>>20) 22 | if blocksPerSecond > 0 { 23 | fmt.Printf("%d blocks/s\n", blocksPerSecond) 24 | } else { 25 | fmt.Println("I/O accounting not available") 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cmd/hypervisor/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6976 7 | -------------------------------------------------------------------------------- /cmd/hypervisor/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all hypervisor 10 | install_service virtual-machines 11 | -------------------------------------------------------------------------------- /cmd/hypervisor/required-methods: -------------------------------------------------------------------------------- 1 | Hypervisor.PrepareVmForMigration 2 | ImageServer.CheckDirectory 3 | ImageServer.FindLatestImage 4 | ImageServer.GetImage 5 | ObjectServer.GetObjects 6 | -------------------------------------------------------------------------------- /cmd/image-unpacker/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6974 7 | -------------------------------------------------------------------------------- /cmd/image-unpacker/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | $echo cp -p scripts/image-pusher/* /usr/local/etc || exit 10 | install_all image-unpacker 11 | -------------------------------------------------------------------------------- /cmd/image-unpacker/required-methods: -------------------------------------------------------------------------------- 1 | ImageServer.GetImage 2 | ObjectServer.GetObjects 3 | -------------------------------------------------------------------------------- /cmd/image-unpacker/stub.go: -------------------------------------------------------------------------------- 1 | // +build !linux 2 | 3 | package main 4 | 5 | import ( 6 | "os" 7 | ) 8 | 9 | func main() { 10 | os.Stderr.Write([]byte("Not available on this OS\n")) 11 | os.Exit(1) 12 | } 13 | -------------------------------------------------------------------------------- /cmd/imageserver/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6971 7 | -------------------------------------------------------------------------------- /cmd/imageserver/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all imageserver 10 | -------------------------------------------------------------------------------- /cmd/imageserver/required-methods: -------------------------------------------------------------------------------- 1 | ImageServer.AddImageTrusted 2 | ImageServer.GetImageUpdates 3 | ImageServer.GetImage 4 | ObjectServer.AddObjects 5 | ObjectServer.CheckObjects 6 | ObjectServer.GetObjects 7 | -------------------------------------------------------------------------------- /cmd/imagetool/checkDirectory.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | ) 9 | 10 | func checkDirectorySubcommand(args []string) { 11 | imageSClient, _ := getClients() 12 | directoryExists, err := client.CheckDirectory(imageSClient, args[0]) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error checking directory: %s\n", err) 15 | os.Exit(1) 16 | } 17 | if directoryExists { 18 | os.Exit(0) 19 | } 20 | os.Exit(1) 21 | } 22 | -------------------------------------------------------------------------------- /cmd/imagetool/checkImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | ) 9 | 10 | func checkImageSubcommand(args []string) { 11 | imageSClient, _ := getClients() 12 | imageExists, err := client.CheckImage(imageSClient, args[0]) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error checking image\t%s\n", err) 15 | os.Exit(1) 16 | } 17 | if imageExists { 18 | os.Exit(0) 19 | } 20 | os.Exit(1) 21 | } 22 | -------------------------------------------------------------------------------- /cmd/imagetool/chownDirectory.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | ) 9 | 10 | func chownDirectorySubcommand(args []string) { 11 | imageSClient, _ := getClients() 12 | if err := client.ChownDirectory(imageSClient, args[0], 13 | args[1]); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error changing directory ownership: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | -------------------------------------------------------------------------------- /cmd/imagetool/computedFiles.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/Symantec/Dominator/lib/filesystem" 7 | "github.com/Symantec/Dominator/lib/filesystem/util" 8 | ) 9 | 10 | type computedFileType struct { 11 | Filename string 12 | Source string 13 | } 14 | 15 | func spliceComputedFiles(fs *filesystem.FileSystem) error { 16 | if *computedFiles == "" { 17 | return nil 18 | } 19 | cfl, err := util.LoadComputedFiles(*computedFiles) 20 | if err != nil { 21 | return errors.New("cannot load computed files: " + err.Error()) 22 | } 23 | if err := util.SpliceComputedFiles(fs, cfl); err != nil { 24 | return errors.New("cannot splice computed files: " + err.Error()) 25 | } 26 | return nil 27 | } 28 | -------------------------------------------------------------------------------- /cmd/imagetool/deleteImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | ) 9 | 10 | func deleteImageSubcommand(args []string) { 11 | imageSClient, _ := getClients() 12 | if err := client.DeleteImage(imageSClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error deleting image\t%s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/imagetool/deleteUnreferencedObjects.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "strconv" 7 | 8 | "github.com/Symantec/Dominator/imageserver/client" 9 | ) 10 | 11 | func deleteUnreferencedObjectsSubcommand(args []string) { 12 | imageSClient, _ := getClients() 13 | percentage, err := strconv.ParseUint(args[0], 10, 8) 14 | if err != nil { 15 | fmt.Fprintf(os.Stderr, "Error parsing percentage: %s\n", err) 16 | os.Exit(1) 17 | } 18 | bytes, err := strconv.ParseUint(args[1], 10, 64) 19 | if err != nil { 20 | fmt.Fprintf(os.Stderr, "Error parsing bytes: %s\n", err) 21 | os.Exit(1) 22 | } 23 | if err := client.DeleteUnreferencedObjects(imageSClient, uint8(percentage), 24 | bytes); err != nil { 25 | fmt.Fprintf(os.Stderr, "Error deleting unreferenced objects: %s\n", err) 26 | os.Exit(1) 27 | } 28 | os.Exit(0) 29 | } 30 | -------------------------------------------------------------------------------- /cmd/imagetool/estimate.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/format" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func estimateImageUsageSubcommand(args []string) { 12 | imageSClient, _ := getClients() 13 | if err := estimateImageUsage(imageSClient, args[0]); err != nil { 14 | fmt.Fprintf(os.Stderr, "Error estimating image size: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func estimateImageUsage(client *srpc.Client, image string) error { 21 | fs, err := getFsOfImage(client, image) 22 | if err != nil { 23 | return err 24 | } 25 | _, err = fmt.Println(format.FormatBytes(fs.EstimateUsage(0))) 26 | return err 27 | } 28 | -------------------------------------------------------------------------------- /cmd/imagetool/findLatestImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "os" 7 | 8 | "github.com/Symantec/Dominator/imageserver/client" 9 | ) 10 | 11 | func findLatestImageSubcommand(args []string) { 12 | if err := findLatestImage(args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error finding latest image: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func findLatestImage(dirname string) error { 20 | imageSClient, _ := getClients() 21 | imageName, err := client.FindLatestImage(imageSClient, dirname, 22 | *ignoreExpiring) 23 | if err != nil { 24 | return err 25 | } 26 | if imageName == "" { 27 | return errors.New("no image found") 28 | } 29 | fmt.Println(imageName) 30 | return nil 31 | } 32 | -------------------------------------------------------------------------------- /cmd/imagetool/listImages.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | "github.com/Symantec/Dominator/lib/verstr" 10 | ) 11 | 12 | func listImagesSubcommand(args []string) { 13 | imageClient, _ := getClients() 14 | if err := listImages(imageClient); err != nil { 15 | fmt.Fprintf(os.Stderr, "Error listing images\t%s\n", err) 16 | os.Exit(1) 17 | } 18 | os.Exit(0) 19 | } 20 | 21 | func listImages(imageSClient *srpc.Client) error { 22 | imageNames, err := client.ListImages(imageSClient) 23 | if err != nil { 24 | return err 25 | } 26 | verstr.Sort(imageNames) 27 | for _, name := range imageNames { 28 | fmt.Println(name) 29 | } 30 | return nil 31 | } 32 | -------------------------------------------------------------------------------- /cmd/imagetool/makeDirectory.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageserver/client" 8 | ) 9 | 10 | func makeDirectorySubcommand(args []string) { 11 | imageSClient, _ := getClients() 12 | if err := client.MakeDirectory(imageSClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error creating directory: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/imagetool/mergeFilters.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/filter" 8 | ) 9 | 10 | func mergeFiltersSubcommand(args []string) { 11 | err := mergeFilters(args) 12 | if err != nil { 13 | fmt.Fprintf(os.Stderr, "Error merging filter: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func mergeFilters(filterFiles []string) error { 20 | mergeableFilter := &filter.MergeableFilter{} 21 | for _, filterFile := range filterFiles { 22 | filt, err := filter.Load(filterFile) 23 | if err != nil { 24 | return err 25 | } 26 | mergeableFilter.Merge(filt) 27 | } 28 | filt := mergeableFilter.ExportFilter() 29 | for _, filterLine := range filt.FilterLines { 30 | if _, err := fmt.Println(filterLine); err != nil { 31 | return err 32 | } 33 | } 34 | return nil 35 | } 36 | -------------------------------------------------------------------------------- /cmd/imagetool/mergeTriggers.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | json "github.com/Symantec/Dominator/lib/json" 8 | "github.com/Symantec/Dominator/lib/triggers" 9 | ) 10 | 11 | func mergeTriggersSubcommand(args []string) { 12 | err := mergeTriggers(args) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error merging triggers: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | 20 | func mergeTriggers(triggerFiles []string) error { 21 | mergeableTriggers := &triggers.MergeableTriggers{} 22 | for _, triggerFile := range triggerFiles { 23 | trig, err := triggers.Load(triggerFile) 24 | if err != nil { 25 | return err 26 | } 27 | mergeableTriggers.Merge(trig) 28 | } 29 | trig := mergeableTriggers.ExportTriggers() 30 | return json.WriteWithIndent(os.Stdout, " ", trig.Triggers) 31 | } 32 | -------------------------------------------------------------------------------- /cmd/imagetool/showImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | ) 7 | 8 | func showImageSubcommand(args []string) { 9 | if err := showImage(args[0]); err != nil { 10 | fmt.Fprintf(os.Stderr, "Error showing image\t%s\n", err) 11 | os.Exit(1) 12 | } 13 | os.Exit(0) 14 | } 15 | 16 | func showImage(image string) error { 17 | fs, err := getTypedImage(image) 18 | if err != nil { 19 | return err 20 | } 21 | return fs.Listf(os.Stdout, listSelector, listFilter) 22 | } 23 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/computed-files: -------------------------------------------------------------------------------- 1 | /etc/issue.net localhost:6972 2 | /etc/mdb.json localhost:6972 3 | /etc/ssl/CA.pem localhost:6972 4 | /etc/ssl/dominator/cert.pem localhost:6972 5 | /etc/ssl/dominator/key.pem localhost:6972 6 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/dominator/flags.default: -------------------------------------------------------------------------------- 1 | fdLimit = 64000 2 | idleMarkTimeout = 5m 3 | imageServerHostname = imageserver.prod.acme.com 4 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/issue.net: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Symantec/Dominator/aa74118a1c98d808a8c9332bf9219a4ce60bf8e9/cmd/imaginator/example-manifests/dominator/files/etc/issue.net -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/mdb.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Symantec/Dominator/aa74118a1c98d808a8c9332bf9219a4ce60bf8e9/cmd/imaginator/example-manifests/dominator/files/etc/mdb.json -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/systemd/system/dominator.service.d/env.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | LimitNOFILE=65536 3 | User=dominator 4 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/systemd/system/filegen-server.service.d/env.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | ExecStart= 3 | ExecStart=/usr/local/sbin/filegen-server /var/lib/filegen-server/computed-files/root 4 | User=filegen-server 5 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/etc/systemd/system/mdbd.service.d/env.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | User=mdbd 3 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/var/lib/filegen-server/computed-files/issue.net.template: -------------------------------------------------------------------------------- 1 | This system is Dominated with image {{.RequiredImage}} and kernel v\r \m \n \l 2 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/files/var/lib/filegen-server/config: -------------------------------------------------------------------------------- 1 | DynamicTemplateFile /etc/issue.net /var/lib/filegen-server/computed-files/issue.net.template 2 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/filter.add: -------------------------------------------------------------------------------- 1 | /etc/dominator/flags[.]extra 2 | /etc/filegen-server/flags[.]extra 3 | /etc/mdbd/flags[.]extra 4 | /etc/ssl/mdbd(|/.*)$ 5 | /var/lib/Dominator/.* 6 | /var/lib/filegen-server/.* 7 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/manifest: -------------------------------------------------------------------------------- 1 | { 2 | "SourceImage": "image-team/minimal/Debian-9" 3 | } 4 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/package-list: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Symantec/Dominator/aa74118a1c98d808a8c9332bf9219a4ce60bf8e9/cmd/imaginator/example-manifests/dominator/package-list -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/scripts/01_install_dominator: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -ex 4 | 5 | readonly dir='/tmp/dominator-unpack' 6 | 7 | rm -rf "$dir" || true 8 | mkdir -p "$dir" 9 | wget -q -O /tmp/dominator.tar.gz http://mirror.prod.acme.com/misc/Dominator/dominator.tar.gz 10 | tar -C "$dir" -xzf /tmp/dominator.tar.gz 11 | rm /tmp/dominator.tar.gz 12 | 13 | "$dir/install" 14 | rm -rf "$dir" 15 | 16 | mkdir -p /var/lib/Dominator /var/log/dominator 17 | 18 | chown -R dominator /etc/ssl/dominator /var/lib/Dominator /var/log/dominator 19 | 20 | # Remove noise. 21 | rm -f /etc/motd 22 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/scripts/01_install_filegen-server: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -ex 4 | 5 | readonly dir='/tmp/filegen-server-unpack' 6 | 7 | rm -rf "$dir" || true 8 | mkdir -p "$dir" 9 | wget -q -O /tmp/filegen-server.tar.gz http://mirror.prod.acme.com/misc/Dominator/filegen-server.tar.gz 10 | tar -C "$dir" -xzf /tmp/filegen-server.tar.gz 11 | rm /tmp/filegen-server.tar.gz 12 | 13 | "$dir/install" 14 | rm -rf "$dir" 15 | 16 | mkdir -p /var/lib/filegen-server /var/log/filegen-server 17 | 18 | chown -R filegen-server /etc/ssl/filegen-server /var/lib/filegen-server \ 19 | /var/log/filegen-server 20 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/dominator/scripts/01_install_mdbd: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -ex 4 | 5 | readonly dir='/tmp/mdbd-unpack' 6 | 7 | rm -rf "$dir" || true 8 | mkdir -p "$dir" 9 | wget -q -O /tmp/mdbd.tar.gz http://mirror.prod.acme.com/misc/Dominator/mdbd.tar.gz 10 | tar -C "$dir" -xzf /tmp/mdbd.tar.gz 11 | rm /tmp/mdbd.tar.gz 12 | 13 | "$dir/install" 14 | rm -rf "$dir" 15 | 16 | mkdir -p /var/log/mdbd 17 | 18 | chown -R mdbd /var/log/mdbd 19 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/computed-files: -------------------------------------------------------------------------------- 1 | /etc/issue.net localhost:6972 2 | /etc/mdb.json localhost:6972 3 | /etc/ssl/imageserver/cert.pem localhost:6972 4 | /etc/ssl/imageserver/key.pem localhost:6972 5 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/files/etc/imageserver/flags.default: -------------------------------------------------------------------------------- 1 | imageDir = /data/imageserver 2 | objectDir = /data/objectserver 3 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/files/etc/issue.net: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Symantec/Dominator/aa74118a1c98d808a8c9332bf9219a4ce60bf8e9/cmd/imaginator/example-manifests/imageserver/files/etc/issue.net -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/files/etc/mdb.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Symantec/Dominator/aa74118a1c98d808a8c9332bf9219a4ce60bf8e9/cmd/imaginator/example-manifests/imageserver/files/etc/mdb.json -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/files/etc/systemd/system/imageserver.service.d/env.conf: -------------------------------------------------------------------------------- 1 | [Service] 2 | User=imageserver 3 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/filter.add: -------------------------------------------------------------------------------- 1 | /data(|/.*)$ 2 | /etc/imageserver/flags[.]extra 3 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/manifest: -------------------------------------------------------------------------------- 1 | { 2 | "SourceImage": "image-team/minimal/Debian-9" 3 | } 4 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/package-list: -------------------------------------------------------------------------------- 1 | bash-completion 2 | curl 3 | dnsutils 4 | lsof 5 | ltrace 6 | man-db 7 | manpages 8 | mtr-tiny 9 | strace 10 | tcpdump 11 | tcptraceroute 12 | tcsh 13 | telnet 14 | tmpreaper 15 | traceroute 16 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/scripts/01_install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -ex 4 | 5 | readonly dir='/tmp/imageserver-unpack' 6 | 7 | rm -rf "$dir" || true 8 | mkdir -p "$dir" 9 | wget -q -O /tmp/imageserver.tar.gz http://mirror.prod.acme.com/misc/Dominator/imageserver.tar.gz 10 | tar -C "$dir" -xzf /tmp/imageserver.tar.gz 11 | rm /tmp/imageserver.tar.gz 12 | 13 | "$dir/install" 14 | rm -rf "$dir" 15 | 16 | mkdir -p /data /etc/imageserver /var/log/imageserver 17 | chmod a-w /data 18 | 19 | chown -R imageserver /etc/imageserver /etc/ssl/imageserver /var/log/imageserver 20 | 21 | # Remove noise. 22 | rm -f /etc/motd 23 | -------------------------------------------------------------------------------- /cmd/imaginator/example-manifests/imageserver/triggers.add: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "MatchLines": [ 4 | "/etc/imageserver/.*", 5 | "/etc/reverse-listeners/Scotty", 6 | "/etc/ssl/CA[.]pem", 7 | "/etc/ssl/imageserver/.*", 8 | "/etc/systemd/system/imageserver[.]service[.d]/.*", 9 | "/lib/systemd/system/imageserver[.]service", 10 | "/usr/local/sbin/imageserver" 11 | ], 12 | "Service": "imageserver" 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /cmd/imaginator/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6975 7 | -------------------------------------------------------------------------------- /cmd/imaginator/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all imaginator 10 | -------------------------------------------------------------------------------- /cmd/imaginator/required-methods: -------------------------------------------------------------------------------- 1 | ImageServer.AddImage 2 | ImageServer.GetImage 3 | ImageServer.ListDirectories 4 | ImageServer.ListImages 5 | ImageServer.MakeDirectory 6 | Imaginator.BuildImage 7 | ObjectServer.AddObjects 8 | ObjectServer.GetObjects 9 | -------------------------------------------------------------------------------- /cmd/imaginator/required-methods.slave: -------------------------------------------------------------------------------- 1 | ImageServer.GetImage 2 | ImageServer.ListDirectories 3 | ImageServer.ListImages 4 | ObjectServer.AddObjects 5 | ObjectServer.GetObjects 6 | -------------------------------------------------------------------------------- /cmd/imaginator/streams.json: -------------------------------------------------------------------------------- 1 | { 2 | "Streams": { 3 | "image-team/base/Ubuntu-14.04": { 4 | "ManifestUrl": "https://git.company.com/Prod-team/image-team.git", 5 | "ManifestDirectory": "$IMAGE_STREAM" 6 | }, 7 | "image-team/minimal/Ubuntu-14.04": { 8 | "ManifestUrl": "https://git.company.com/Prod-team/image-team.git", 9 | "ManifestDirectory": "$IMAGE_STREAM" 10 | }, 11 | "dev-team/webapp/widget-app": { 12 | "ManifestUrl": "https://$GIT_USERNAME:$GIT_PASSWORD@secure-git.company.com/Products/Widgets/webapp.git", 13 | "ManifestDirectory": "" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /cmd/imaginator/stub.go: -------------------------------------------------------------------------------- 1 | // +build !linux 2 | 3 | package main 4 | 5 | import ( 6 | "os" 7 | ) 8 | 9 | func main() { 10 | os.Stderr.Write([]byte("Not available on this OS\n")) 11 | os.Exit(1) 12 | } 13 | -------------------------------------------------------------------------------- /cmd/installer/make-tarball: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -eu 4 | 5 | readonly command="$1" 6 | shift 7 | 8 | readonly bin="$GOPATH/bin/$command" 9 | readonly target="/tmp/$LOGNAME/$command.tar.gz" 10 | 11 | (cd $GOPATH/src; go install github.com/Symantec/Dominator/cmd/$command) 12 | 13 | strip -o "$bin~" "$bin" 14 | if cmp -s "$bin~" "$bin"; then 15 | rm "$bin~" 16 | else 17 | touch -r "$bin" "$bin~" 18 | mv "$bin~" "$bin" 19 | fi 20 | 21 | readonly tmpdir="$(mktemp -d '/tmp/make-tarball.XXXXXX')" || exit 22 | trap "rm -rf $tmpdir" EXIT 23 | 24 | mkdir -p "$tmpdir/etc/ssl/installer" "$tmpdir/usr/local/sbin" 25 | cp -p "$ETCDIR/ssl/"*.pem "$tmpdir/etc/ssl" 26 | cp -p "$ETCDIR/ssl/installer/"* "$tmpdir/etc/ssl/installer" 27 | cp -p "$bin" "$tmpdir/usr/local/sbin" 28 | 29 | tar --owner=0 --group=0 -czf "$target" -C "$tmpdir" . 30 | -------------------------------------------------------------------------------- /cmd/installer/required-methods: -------------------------------------------------------------------------------- 1 | ImageServer.CheckDirectory 2 | ImageServer.FindLatestImage 3 | ImageServer.GetImage 4 | ObjectServer.GetObjects 5 | -------------------------------------------------------------------------------- /cmd/installer/shell.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "os/exec" 6 | 7 | "github.com/Symantec/Dominator/lib/log" 8 | ) 9 | 10 | func runShellOnConsole(logger log.DebugLogger) { 11 | for { 12 | logger.Println("starting shell on console") 13 | cmd := exec.Command("/bin/busybox", "sh", "-i") 14 | cmd.Stdin = os.Stdin 15 | cmd.Stdout = os.Stdout 16 | cmd.Stderr = os.Stderr 17 | if err := cmd.Run(); err != nil { 18 | logger.Printf("error running shell: %s\n", err) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /cmd/installer/stub.go: -------------------------------------------------------------------------------- 1 | // +build !linux 2 | 3 | package main 4 | 5 | import ( 6 | "os" 7 | ) 8 | 9 | func main() { 10 | os.Stderr.Write([]byte("Not available on this OS\n")) 11 | os.Exit(1) 12 | } 13 | -------------------------------------------------------------------------------- /cmd/mdbd/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6973 7 | -------------------------------------------------------------------------------- /cmd/mdbd/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | echo= 10 | 11 | $echo mkdir -p /usr/local/sbin || exit 12 | $echo cp -p bin/* /usr/local/sbin || exit 13 | $echo mkdir -p /etc/health-agent/tests.d 14 | $echo cp -p health-check.yml /etc/health-agent/tests.d/mdbd.yml || exit 15 | install_service mdbd || exit 16 | -------------------------------------------------------------------------------- /cmd/mdbd/required-methods: -------------------------------------------------------------------------------- 1 | FleetManager.GetUpdates 2 | Hypervisor.GetUpdates 3 | -------------------------------------------------------------------------------- /cmd/objecttool/checkObject.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/hash" 8 | "github.com/Symantec/Dominator/lib/objectcache" 9 | "github.com/Symantec/Dominator/lib/objectserver" 10 | ) 11 | 12 | func checkObjectSubcommand(objSrv objectserver.ObjectServer, args []string) { 13 | hashes := make([]hash.Hash, 1) 14 | var err error 15 | hashes[0], err = objectcache.FilenameToHash(args[0]) 16 | if err != nil { 17 | fmt.Fprintf(os.Stderr, "Error parsing hash\t%s\n", err) 18 | os.Exit(2) 19 | } 20 | objectSizes, err := objSrv.CheckObjects(hashes) 21 | if err != nil { 22 | fmt.Fprintf(os.Stderr, "Error checking object\t%s\n", err) 23 | os.Exit(2) 24 | } 25 | if objectSizes[0] > 0 { 26 | os.Exit(0) 27 | } else { 28 | os.Exit(1) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /cmd/subd/health-check.yml: -------------------------------------------------------------------------------- 1 | --- 2 | type: url 3 | probe-freq: 10 4 | specs: 5 | url-path: /healthz 6 | url-port: 6969 7 | -------------------------------------------------------------------------------- /cmd/subd/install: -------------------------------------------------------------------------------- 1 | #! /bin/bash --posix 2 | 3 | set -o nounset 4 | 5 | cd "${0%/*}" 6 | 7 | . ./scripts/install.lib 8 | 9 | install_all subd 10 | -------------------------------------------------------------------------------- /cmd/subd/required-methods: -------------------------------------------------------------------------------- 1 | ObjectServer.GetObjects 2 | -------------------------------------------------------------------------------- /cmd/subtool/boostCpuLimit.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/sub/client" 8 | ) 9 | 10 | func boostCpuLimitSubcommand(getSubClient getSubClientFunc, args []string) { 11 | if err := boostCpuLimit(getSubClient()); err != nil { 12 | logger.Fatalf("Error boosting CPU limit: %s\n", err) 13 | } 14 | os.Exit(0) 15 | } 16 | 17 | func boostCpuLimit(srpcClient *srpc.Client) error { 18 | return client.BoostCpuLimit(srpcClient) 19 | } 20 | -------------------------------------------------------------------------------- /cmd/subtool/cleanup.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/proto/sub" 8 | "github.com/Symantec/Dominator/sub/client" 9 | ) 10 | 11 | func cleanupSubcommand(getSubClient getSubClientFunc, args []string) { 12 | if err := cleanup(getSubClient()); err != nil { 13 | logger.Fatalf("Error cleaning up: %s\n", err) 14 | } 15 | os.Exit(0) 16 | } 17 | 18 | func cleanup(srpcClient *srpc.Client) error { 19 | var request sub.PollRequest 20 | var reply sub.PollResponse 21 | if err := client.CallPoll(srpcClient, request, &reply); err != nil { 22 | return err 23 | } 24 | if len(reply.ObjectCache) < 1 { 25 | return nil 26 | } 27 | logger.Printf("Deleting: %d objects\n", len(reply.ObjectCache)) 28 | return client.Cleanup(srpcClient, reply.ObjectCache) 29 | } 30 | -------------------------------------------------------------------------------- /cmd/subtool/delete.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/proto/sub" 8 | "github.com/Symantec/Dominator/sub/client" 9 | ) 10 | 11 | func deleteSubcommand(getSubClient getSubClientFunc, args []string) { 12 | if err := deletePaths(getSubClient(), args); err != nil { 13 | logger.Fatalf("Error deleting: %s\n", err) 14 | } 15 | os.Exit(0) 16 | } 17 | 18 | func deletePaths(srpcClient *srpc.Client, pathnames []string) error { 19 | return client.CallUpdate(srpcClient, sub.UpdateRequest{ 20 | PathsToDelete: pathnames, 21 | Wait: true}, 22 | &sub.UpdateResponse{}) 23 | } 24 | -------------------------------------------------------------------------------- /cmd/subtool/getConfig.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/sub/client" 9 | ) 10 | 11 | func getConfigSubcommand(getSubClient getSubClientFunc, args []string) { 12 | if err := getConfig(getSubClient()); err != nil { 13 | logger.Fatalf("Error getting config: %s\n", err) 14 | } 15 | os.Exit(0) 16 | } 17 | 18 | func getConfig(srpcClient *srpc.Client) error { 19 | config, err := client.GetConfiguration(srpcClient) 20 | if err != nil { 21 | return err 22 | } 23 | fmt.Println(config) 24 | return nil 25 | } 26 | -------------------------------------------------------------------------------- /cmd/subtool/setConfig.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/proto/sub" 8 | "github.com/Symantec/Dominator/sub/client" 9 | ) 10 | 11 | func setConfigSubcommand(getSubClient getSubClientFunc, args []string) { 12 | if err := setConfig(getSubClient()); err != nil { 13 | logger.Fatalf("Error setting config: %s\n", err) 14 | } 15 | os.Exit(0) 16 | } 17 | 18 | func setConfig(srpcClient *srpc.Client) error { 19 | var config sub.Configuration 20 | config.CpuPercent = *cpuPercent 21 | config.NetworkSpeedPercent = *networkSpeedPercent 22 | config.ScanExclusionList = scanExcludeList 23 | config.ScanSpeedPercent = *scanSpeedPercent 24 | return client.SetConfiguration(srpcClient, config) 25 | } 26 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/associate.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func associateSubcommand(srpcClient *srpc.Client, args []string) { 12 | err := client.AssociateStreamWithDevice(srpcClient, args[0], args[1]) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error associating: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/exportImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func exportImageSubcommand(srpcClient *srpc.Client, args []string) { 12 | err := client.ExportImage(srpcClient, args[0], args[1], args[2]) 13 | if err != nil { 14 | fmt.Fprintf(os.Stderr, "Error exporting image: %s\n", err) 15 | os.Exit(1) 16 | } 17 | os.Exit(0) 18 | } 19 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/prepareForCapture.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func prepareForCaptureSubcommand(srpcClient *srpc.Client, args []string) { 12 | if err := client.PrepareForCapture(srpcClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error preparing for capture: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/prepareForCopy.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func prepareForCopySubcommand(srpcClient *srpc.Client, args []string) { 12 | if err := client.PrepareForCopy(srpcClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error preparing for copy: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/prepareForUnpack.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func prepareForUnpackSubcommand(srpcClient *srpc.Client, args []string) { 12 | if err := prepareForUnpack(srpcClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error preparing for unpack: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | 19 | func prepareForUnpack(srpcClient *srpc.Client, streamName string) error { 20 | return client.PrepareForUnpack(srpcClient, streamName, false, false) 21 | } 22 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/removeDevice.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func removeDeviceSubcommand(srpcClient *srpc.Client, args []string) { 12 | if err := client.RemoveDevice(srpcClient, args[0]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error removing device: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/unpacker-tool/unpackImage.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/Symantec/Dominator/imageunpacker/client" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | ) 10 | 11 | func unpackImageSubcommand(srpcClient *srpc.Client, args []string) { 12 | if err := client.UnpackImage(srpcClient, args[0], args[1]); err != nil { 13 | fmt.Fprintf(os.Stderr, "Error unpacking image: %s\n", err) 14 | os.Exit(1) 15 | } 16 | os.Exit(0) 17 | } 18 | -------------------------------------------------------------------------------- /cmd/vm-control/dial.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | ) 6 | 7 | func dialFleetManager(address string) (*srpc.Client, error) { 8 | return srpc.DialHTTPWithDialer("tcp", address, rrDialer) 9 | } 10 | 11 | func dialHypervisor(address string) (*srpc.Client, error) { 12 | return srpc.DialHTTP("tcp", address, 0) 13 | } 14 | -------------------------------------------------------------------------------- /cmd/vm-control/variables_darwin.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | const defaultVncViewer = "" 4 | -------------------------------------------------------------------------------- /cmd/vm-control/variables_linux.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | const defaultVncViewer = "vncviewer" 4 | -------------------------------------------------------------------------------- /dom/rpcd/api.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/dom/herd" 5 | "github.com/Symantec/Dominator/lib/log" 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | ) 8 | 9 | type rpcType struct { 10 | herd *herd.Herd 11 | logger log.Logger 12 | } 13 | 14 | func Setup(herd *herd.Herd, logger log.Logger) { 15 | rpcObj := &rpcType{ 16 | herd: herd, 17 | logger: logger} 18 | srpc.RegisterName("Dominator", rpcObj) 19 | } 20 | -------------------------------------------------------------------------------- /dom/rpcd/clearSafetyShutoff.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) ClearSafetyShutoff(conn *srpc.Conn, 9 | request dominator.ClearSafetyShutoffRequest, 10 | reply *dominator.ClearSafetyShutoffResponse) error { 11 | if conn.Username() == "" { 12 | t.logger.Printf("ClearSafetyShutoff(%s)\n", request.Hostname) 13 | } else { 14 | t.logger.Printf("ClearSafetyShutoff(%s): by %s\n", 15 | request.Hostname, conn.Username()) 16 | } 17 | return t.herd.ClearSafetyShutoff(request.Hostname) 18 | } 19 | -------------------------------------------------------------------------------- /dom/rpcd/configureSubs.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | "github.com/Symantec/Dominator/proto/sub" 7 | ) 8 | 9 | func (t *rpcType) ConfigureSubs(conn *srpc.Conn, 10 | request dominator.ConfigureSubsRequest, 11 | reply *dominator.ConfigureSubsResponse) error { 12 | if conn.Username() == "" { 13 | t.logger.Printf("ConfigureSubs()\n") 14 | } else { 15 | t.logger.Printf("ConfigureSubs(): by %s\n", conn.Username()) 16 | } 17 | return t.herd.ConfigureSubs(sub.Configuration(request)) 18 | } 19 | -------------------------------------------------------------------------------- /dom/rpcd/disableUpdates.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) DisableUpdates(conn *srpc.Conn, 9 | request dominator.DisableUpdatesRequest, 10 | reply *dominator.DisableUpdatesResponse) error { 11 | if conn.Username() == "" { 12 | t.logger.Printf("DisableUpdates(%s)\n", request.Reason) 13 | } else { 14 | t.logger.Printf("DisableUpdates(%s): by %s\n", 15 | request.Reason, conn.Username()) 16 | } 17 | return t.herd.DisableUpdates(conn.Username(), request.Reason) 18 | } 19 | -------------------------------------------------------------------------------- /dom/rpcd/enableUpdates.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) EnableUpdates(conn *srpc.Conn, 9 | request dominator.EnableUpdatesRequest, 10 | reply *dominator.EnableUpdatesResponse) error { 11 | if conn.Username() == "" { 12 | t.logger.Printf("EnableUpdates(%s)\n", request.Reason) 13 | } else { 14 | t.logger.Printf("EnableUpdates(%s): by %s\n", 15 | request.Reason, conn.Username()) 16 | } 17 | return t.herd.EnableUpdates() 18 | } 19 | -------------------------------------------------------------------------------- /dom/rpcd/getDefaultImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) GetDefaultImage(conn *srpc.Conn, 9 | request dominator.GetDefaultImageRequest, 10 | reply *dominator.GetDefaultImageResponse) error { 11 | reply.ImageName = t.herd.GetDefaultImage() 12 | return nil 13 | } 14 | -------------------------------------------------------------------------------- /dom/rpcd/getSubsConfiguration.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) GetSubsConfiguration(conn *srpc.Conn, 9 | request dominator.GetSubsConfigurationRequest, 10 | reply *dominator.GetSubsConfigurationResponse) error { 11 | *reply = dominator.GetSubsConfigurationResponse( 12 | t.herd.GetSubsConfiguration()) 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /dom/rpcd/setDefaultImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/dominator" 6 | ) 7 | 8 | func (t *rpcType) SetDefaultImage(conn *srpc.Conn, 9 | request dominator.SetDefaultImageRequest, 10 | reply *dominator.SetDefaultImageResponse) error { 11 | if conn.Username() == "" { 12 | t.logger.Printf("SetDefaultImage(%s)\n", request.ImageName) 13 | } else { 14 | t.logger.Printf("SetDefaultImage(%s): by %s\n", 15 | request.ImageName, conn.Username()) 16 | } 17 | return t.herd.SetDefaultImage(request.ImageName) 18 | } 19 | -------------------------------------------------------------------------------- /fleetmanager/hypervisors/fsstorer/check.go: -------------------------------------------------------------------------------- 1 | package fsstorer 2 | 3 | import ( 4 | "errors" 5 | "net" 6 | ) 7 | 8 | func (s *Storer) checkIpIsRegistered(addr net.IP) (bool, error) { 9 | if ip, err := netIpToIp(addr); err != nil { 10 | return false, err 11 | } else { 12 | s.mutex.RLock() 13 | defer s.mutex.RUnlock() 14 | _, ok := s.ipToHypervisor[ip] 15 | return ok, nil 16 | } 17 | } 18 | 19 | func netIpToIp(netIP net.IP) (IP, error) { 20 | switch len(netIP) { 21 | case 4: 22 | case 16: 23 | netIP = netIP.To4() 24 | if netIP == nil { 25 | return zeroIP, errors.New("bad IP") 26 | } 27 | default: 28 | return zeroIP, errors.New("bad IP") 29 | } 30 | var ip IP 31 | copy(ip[:], netIP) 32 | return ip, nil 33 | } 34 | -------------------------------------------------------------------------------- /fleetmanager/hypervisors/fsstorer/get.go: -------------------------------------------------------------------------------- 1 | package fsstorer 2 | 3 | import ( 4 | "net" 5 | ) 6 | 7 | func (s *Storer) getHypervisorForIp(addr net.IP) (net.IP, error) { 8 | if ip, err := netIpToIp(addr); err != nil { 9 | return nil, err 10 | } else { 11 | s.mutex.RLock() 12 | hypervisor, ok := s.ipToHypervisor[ip] 13 | s.mutex.RUnlock() 14 | if !ok { 15 | return nil, nil 16 | } 17 | return hypervisor[:], nil 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /fleetmanager/hypervisors/fsstorer/ip.go: -------------------------------------------------------------------------------- 1 | package fsstorer 2 | 3 | import "fmt" 4 | 5 | func (ip IP) string() string { 6 | return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]) 7 | } 8 | -------------------------------------------------------------------------------- /fleetmanager/hypervisors/status.go: -------------------------------------------------------------------------------- 1 | package hypervisors 2 | 3 | func (s probeStatus) String() string { 4 | switch s { 5 | case probeStatusNotYetProbed: 6 | return "not yet probed" 7 | case probeStatusConnected: 8 | return "connected" 9 | case probeStatusNoSrpc: 10 | return "no SRPC" 11 | case probeStatusNoService: 12 | return "no service" 13 | case probeStatusConnectionRefused: 14 | return "connection refused" 15 | case probeStatusUnreachable: 16 | return "unreachable" 17 | case probeStatusOff: 18 | return "off" 19 | default: 20 | return "UNKNOWN" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/changeMachineTags.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/fleetmanager" 7 | ) 8 | 9 | func (t *srpcType) ChangeMachineTags(conn *srpc.Conn, 10 | request fleetmanager.ChangeMachineTagsRequest, 11 | reply *fleetmanager.ChangeMachineTagsResponse) error { 12 | *reply = fleetmanager.ChangeMachineTagsResponse{ 13 | errors.ErrorToString(t.hypervisorsManager.ChangeMachineTags( 14 | request.Hostname, conn.GetAuthInformation(), request.Tags))} 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/getHypervisorForVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/Symantec/Dominator/lib/constants" 7 | "github.com/Symantec/Dominator/lib/errors" 8 | "github.com/Symantec/Dominator/lib/srpc" 9 | proto "github.com/Symantec/Dominator/proto/fleetmanager" 10 | ) 11 | 12 | func (t *srpcType) GetHypervisorForVM(conn *srpc.Conn, 13 | request proto.GetHypervisorForVMRequest, 14 | reply *proto.GetHypervisorForVMResponse) error { 15 | hypervisor, err := t.hypervisorsManager.GetHypervisorForVm( 16 | request.IpAddress) 17 | response := proto.GetHypervisorForVMResponse{ 18 | Error: errors.ErrorToString(err), 19 | } 20 | if err == nil { 21 | response.HypervisorAddress = fmt.Sprintf("%s:%d", 22 | hypervisor, constants.HypervisorPortNumber) 23 | } 24 | *reply = response 25 | return nil 26 | } 27 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/html.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "io" 5 | ) 6 | 7 | func (hw *htmlWriter) writeHtml(writer io.Writer) { 8 | } 9 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/listHypervisorLocations.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | proto "github.com/Symantec/Dominator/proto/fleetmanager" 7 | ) 8 | 9 | func (t *srpcType) ListHypervisorLocations(conn *srpc.Conn, 10 | request proto.ListHypervisorLocationsRequest, 11 | reply *proto.ListHypervisorLocationsResponse) error { 12 | locations, err := t.hypervisorsManager.ListLocations(request.TopLocation) 13 | *reply = proto.ListHypervisorLocationsResponse{ 14 | Locations: locations, 15 | Error: errors.ErrorToString(err), 16 | } 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/listHypervisorsInLocation.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | proto "github.com/Symantec/Dominator/proto/fleetmanager" 7 | ) 8 | 9 | func (t *srpcType) ListHypervisorsInLocation(conn *srpc.Conn, 10 | request proto.ListHypervisorsInLocationRequest, 11 | reply *proto.ListHypervisorsInLocationResponse) error { 12 | addresses, err := t.hypervisorsManager.ListHypervisorsInLocation(request) 13 | *reply = proto.ListHypervisorsInLocationResponse{ 14 | HypervisorAddresses: addresses, 15 | Error: errors.ErrorToString(err), 16 | } 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /fleetmanager/rpcd/moveIpAddresses.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | fm_proto "github.com/Symantec/Dominator/proto/fleetmanager" 7 | ) 8 | 9 | func (t *srpcType) MoveIpAddresses(conn *srpc.Conn, 10 | request fm_proto.MoveIpAddressesRequest, 11 | reply *fm_proto.MoveIpAddressesResponse) error { 12 | err := t.hypervisorsManager.MoveIpAddresses(request.HypervisorHostname, 13 | request.IpAddresses) 14 | if err != nil { 15 | *reply = fm_proto.MoveIpAddressesResponse{ 16 | Error: errors.ErrorToString(err)} 17 | } 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /fleetmanager/topology/check.go: -------------------------------------------------------------------------------- 1 | package topology 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | func (t *Topology) checkIfMachineHasSubnet(name, subnetId string) ( 8 | bool, error) { 9 | if directory, ok := t.machineParents[name]; !ok { 10 | return false, fmt.Errorf("unknown machine: %s", name) 11 | } else { 12 | // TODO(rgooch): It would be faster to have a single map for all the 13 | // subnets down to the directory, but it would consume 14 | // more memory. Revisit this if needed. 15 | for ; directory != nil; directory = directory.parent { 16 | if _, ok := directory.subnetIdToSubnet[subnetId]; ok { 17 | return true, nil 18 | } 19 | } 20 | return false, nil 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fleetmanager/topology/get.go: -------------------------------------------------------------------------------- 1 | package topology 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | func (t *Topology) getLocationOfMachine(name string) (string, error) { 8 | if directory, ok := t.machineParents[name]; !ok { 9 | return "", fmt.Errorf("unknown machine: %s", name) 10 | } else { 11 | return directory.path, nil 12 | } 13 | } 14 | 15 | func (t *Topology) getSubnetsForMachine(name string) ([]*Subnet, error) { 16 | if directory, ok := t.machineParents[name]; !ok { 17 | return nil, fmt.Errorf("unknown machine: %s", name) 18 | } else { 19 | var subnets []*Subnet 20 | for ; directory != nil; directory = directory.parent { 21 | subnets = append(subnets, directory.Subnets...) 22 | } 23 | return subnets, nil 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /fleetmanager/topology/walk.go: -------------------------------------------------------------------------------- 1 | package topology 2 | 3 | func (directory *Directory) walk(fn func(*Directory) error) error { 4 | if err := fn(directory); err != nil { 5 | return err 6 | } 7 | for _, subdir := range directory.Directories { 8 | if err := subdir.walk(fn); err != nil { 9 | return err 10 | } 11 | } 12 | return nil 13 | } 14 | -------------------------------------------------------------------------------- /hypervisor/httpd/listAvailableAddresses.go: -------------------------------------------------------------------------------- 1 | package httpd 2 | 3 | import ( 4 | "bufio" 5 | "net/http" 6 | 7 | "github.com/Symantec/Dominator/lib/json" 8 | ) 9 | 10 | func (s state) listAvailableAddressesHandler(w http.ResponseWriter, 11 | req *http.Request) { 12 | writer := bufio.NewWriter(w) 13 | defer writer.Flush() 14 | addresses := s.manager.ListAvailableAddresses() 15 | json.WriteWithIndent(writer, " ", addresses) 16 | } 17 | -------------------------------------------------------------------------------- /hypervisor/httpd/listSubnets.go: -------------------------------------------------------------------------------- 1 | package httpd 2 | 3 | import ( 4 | "bufio" 5 | "net/http" 6 | 7 | "github.com/Symantec/Dominator/lib/json" 8 | ) 9 | 10 | func (s state) listSubnetsHandler(w http.ResponseWriter, req *http.Request) { 11 | writer := bufio.NewWriter(w) 12 | defer writer.Flush() 13 | subnets := s.manager.ListSubnets(true) 14 | json.WriteWithIndent(writer, " ", subnets) 15 | } 16 | -------------------------------------------------------------------------------- /hypervisor/manager/cpu.go: -------------------------------------------------------------------------------- 1 | package manager 2 | 3 | import ( 4 | "errors" 5 | ) 6 | 7 | var ( 8 | errorInsufficientUnallocatedCPU = errors.New( 9 | "insufficient unallocated CPU") 10 | ) 11 | 12 | func (m *Manager) checkSufficientCPUWithLock(milliCPU uint) error { 13 | if milliCPU > m.getAvailableMilliCPUWithLock() { 14 | return errorInsufficientUnallocatedCPU 15 | } 16 | return nil 17 | } 18 | 19 | func (m *Manager) getAvailableMilliCPU() uint { 20 | m.mutex.RLock() 21 | defer m.mutex.RUnlock() 22 | return m.getAvailableMilliCPUWithLock() 23 | } 24 | 25 | func (m *Manager) getAvailableMilliCPUWithLock() uint { 26 | available := m.numCPU * 1000 27 | for _, vm := range m.vms { 28 | available -= int(vm.MilliCPUs) 29 | } 30 | if available < 0 { 31 | return 0 32 | } 33 | return uint(available) 34 | } 35 | -------------------------------------------------------------------------------- /hypervisor/rpcd/acknowledgeVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) AcknowledgeVm(conn *srpc.Conn, 10 | request hypervisor.AcknowledgeVmRequest, 11 | reply *hypervisor.AcknowledgeVmResponse) error { 12 | response := hypervisor.AcknowledgeVmResponse{ 13 | errors.ErrorToString(t.manager.AcknowledgeVm(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/becomePrimaryVmOwner.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) BecomePrimaryVmOwner(conn *srpc.Conn, 10 | request hypervisor.BecomePrimaryVmOwnerRequest, 11 | reply *hypervisor.BecomePrimaryVmOwnerResponse) error { 12 | *reply = hypervisor.BecomePrimaryVmOwnerResponse{ 13 | errors.ErrorToString( 14 | t.manager.BecomePrimaryVmOwner(request.IpAddress, 15 | conn.GetAuthInformation()))} 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/changeOwners.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ChangeOwners(conn *srpc.Conn, 10 | request hypervisor.ChangeOwnersRequest, 11 | reply *hypervisor.ChangeOwnersResponse) error { 12 | response := hypervisor.ChangeOwnersResponse{ 13 | errors.ErrorToString( 14 | t.manager.ChangeOwners(request.OwnerGroups, request.OwnerUsers))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/changeVmConsoleType.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ChangeVmConsoleType(conn *srpc.Conn, 10 | request hypervisor.ChangeVmConsoleTypeRequest, 11 | reply *hypervisor.ChangeVmConsoleTypeResponse) error { 12 | *reply = hypervisor.ChangeVmConsoleTypeResponse{ 13 | errors.ErrorToString( 14 | t.manager.ChangeVmConsoleType(request.IpAddress, 15 | conn.GetAuthInformation(), 16 | request.ConsoleType))} 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /hypervisor/rpcd/changeVmDestroyProtection.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ChangeVmDestroyProtection(conn *srpc.Conn, 10 | request hypervisor.ChangeVmDestroyProtectionRequest, 11 | reply *hypervisor.ChangeVmDestroyProtectionResponse) error { 12 | *reply = hypervisor.ChangeVmDestroyProtectionResponse{ 13 | errors.ErrorToString( 14 | t.manager.ChangeVmDestroyProtection(request.IpAddress, 15 | conn.GetAuthInformation(), 16 | request.DestroyProtection))} 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /hypervisor/rpcd/changeVmOwnerUsers.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ChangeVmOwnerUsers(conn *srpc.Conn, 10 | request hypervisor.ChangeVmOwnerUsersRequest, 11 | reply *hypervisor.ChangeVmOwnerUsersResponse) error { 12 | response := hypervisor.ChangeVmOwnerUsersResponse{ 13 | errors.ErrorToString( 14 | t.manager.ChangeVmOwnerUsers(request.IpAddress, 15 | conn.GetAuthInformation(), 16 | request.OwnerUsers))} 17 | *reply = response 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /hypervisor/rpcd/changeVmTags.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ChangeVmTags(conn *srpc.Conn, 10 | request hypervisor.ChangeVmTagsRequest, 11 | reply *hypervisor.ChangeVmTagsResponse) error { 12 | response := hypervisor.ChangeVmTagsResponse{ 13 | errors.ErrorToString( 14 | t.manager.ChangeVmTags(request.IpAddress, conn.GetAuthInformation(), 15 | request.Tags))} 16 | *reply = response 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /hypervisor/rpcd/commitImportedVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) CommitImportedVm(conn *srpc.Conn, 10 | request hypervisor.CommitImportedVmRequest, 11 | reply *hypervisor.CommitImportedVmResponse) error { 12 | *reply = hypervisor.CommitImportedVmResponse{ 13 | errors.ErrorToString( 14 | t.manager.CommitImportedVm(request.IpAddress, 15 | conn.GetAuthInformation()))} 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/copyVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/hypervisor" 6 | ) 7 | 8 | func (t *srpcType) CopyVm(conn *srpc.Conn) error { 9 | if err := t.copyVm(conn); err != nil { 10 | return conn.Encode(hypervisor.CopyVmResponse{Error: err.Error()}) 11 | } 12 | return nil 13 | } 14 | 15 | func (t *srpcType) copyVm(conn *srpc.Conn) error { 16 | var request hypervisor.CopyVmRequest 17 | if err := conn.Decode(&request); err != nil { 18 | return err 19 | } 20 | return t.manager.CopyVm(conn, request) 21 | } 22 | -------------------------------------------------------------------------------- /hypervisor/rpcd/createVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | ) 6 | 7 | func (t *srpcType) CreateVm(conn *srpc.Conn) error { 8 | return t.manager.CreateVm(conn) 9 | } 10 | -------------------------------------------------------------------------------- /hypervisor/rpcd/deleteVmVolume.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DeleteVmVolume(conn *srpc.Conn, 10 | request hypervisor.DeleteVmVolumeRequest, 11 | reply *hypervisor.DeleteVmVolumeResponse) error { 12 | *reply = hypervisor.DeleteVmVolumeResponse{ 13 | errors.ErrorToString(t.manager.DeleteVmVolume(request.IpAddress, 14 | conn.GetAuthInformation(), request.AccessToken, 15 | request.VolumeIndex))} 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/destroyVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DestroyVm(conn *srpc.Conn, 10 | request hypervisor.DestroyVmRequest, 11 | reply *hypervisor.DestroyVmResponse) error { 12 | response := hypervisor.DestroyVmResponse{ 13 | errors.ErrorToString(t.manager.DestroyVm(request.IpAddress, 14 | conn.GetAuthInformation(), request.AccessToken))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/discardVmAccessToken.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DiscardVmAccessToken(conn *srpc.Conn, 10 | request hypervisor.DiscardVmAccessTokenRequest, 11 | reply *hypervisor.DiscardVmAccessTokenResponse) error { 12 | *reply = hypervisor.DiscardVmAccessTokenResponse{ 13 | errors.ErrorToString(t.manager.DiscardVmAccessToken(request.IpAddress, 14 | conn.GetAuthInformation(), request.AccessToken))} 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /hypervisor/rpcd/discardVmOldImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DiscardVmOldImage(conn *srpc.Conn, 10 | request hypervisor.DiscardVmOldImageRequest, 11 | reply *hypervisor.DiscardVmOldImageResponse) error { 12 | response := hypervisor.DiscardVmOldImageResponse{ 13 | errors.ErrorToString(t.manager.DiscardVmOldImage(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/discardVmOldUserData.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DiscardVmOldUserData(conn *srpc.Conn, 10 | request hypervisor.DiscardVmOldUserDataRequest, 11 | reply *hypervisor.DiscardVmOldUserDataResponse) error { 12 | response := hypervisor.DiscardVmOldUserDataResponse{ 13 | errors.ErrorToString(t.manager.DiscardVmOldUserData(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/discardVmSnapshot.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) DiscardVmSnapshot(conn *srpc.Conn, 10 | request hypervisor.DiscardVmSnapshotRequest, 11 | reply *hypervisor.DiscardVmSnapshotResponse) error { 12 | response := hypervisor.DiscardVmSnapshotResponse{ 13 | errors.ErrorToString(t.manager.DiscardVmSnapshot(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/exportLocalVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ExportLocalVm(conn *srpc.Conn, 10 | request hypervisor.ExportLocalVmRequest, 11 | reply *hypervisor.ExportLocalVmResponse) error { 12 | vmInfo, err := t.exportLocalVm(conn, request) 13 | *reply = hypervisor.ExportLocalVmResponse{ 14 | Error: errors.ErrorToString(err), 15 | VmInfo: *vmInfo, 16 | } 17 | return nil 18 | } 19 | 20 | func (t *srpcType) exportLocalVm(conn *srpc.Conn, 21 | request hypervisor.ExportLocalVmRequest) ( 22 | *hypervisor.ExportLocalVmInfo, error) { 23 | if err := testIfLoopback(conn); err != nil { 24 | return nil, err 25 | } 26 | return t.manager.ExportLocalVm(conn.GetAuthInformation(), request) 27 | } 28 | -------------------------------------------------------------------------------- /hypervisor/rpcd/getVmAccessToken.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) GetVmAccessToken(conn *srpc.Conn, 10 | request hypervisor.GetVmAccessTokenRequest, 11 | reply *hypervisor.GetVmAccessTokenResponse) error { 12 | token, err := t.manager.GetVmAccessToken(request.IpAddress, 13 | conn.GetAuthInformation(), request.Lifetime) 14 | response := hypervisor.GetVmAccessTokenResponse{ 15 | Token: token, 16 | Error: errors.ErrorToString(err), 17 | } 18 | *reply = response 19 | return nil 20 | } 21 | -------------------------------------------------------------------------------- /hypervisor/rpcd/getVmInfo.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) GetVmInfo(conn *srpc.Conn, 10 | request hypervisor.GetVmInfoRequest, 11 | reply *hypervisor.GetVmInfoResponse) error { 12 | info, err := t.manager.GetVmInfo(request.IpAddress) 13 | response := hypervisor.GetVmInfoResponse{ 14 | VmInfo: info, 15 | Error: errors.ErrorToString(err), 16 | } 17 | *reply = response 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /hypervisor/rpcd/getVmVolume.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | ) 6 | 7 | func (t *srpcType) GetVmVolume(conn *srpc.Conn) error { 8 | return t.manager.GetVmVolume(conn) 9 | } 10 | -------------------------------------------------------------------------------- /hypervisor/rpcd/html.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "io" 5 | ) 6 | 7 | func (hw *htmlWriter) writeHtml(writer io.Writer) { 8 | } 9 | -------------------------------------------------------------------------------- /hypervisor/rpcd/listVMs.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "net" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/proto/hypervisor" 8 | ) 9 | 10 | func (t *srpcType) ListVMs(conn *srpc.Conn, 11 | request hypervisor.ListVMsRequest, 12 | reply *hypervisor.ListVMsResponse) error { 13 | ipAddressStrings := t.manager.ListVMs(request.OwnerUsers, request.Sort) 14 | ipAddresses := make([]net.IP, 0, len(ipAddressStrings)) 15 | for _, ipAddressString := range ipAddressStrings { 16 | ipAddress := net.ParseIP(ipAddressString) 17 | if shrunkIP := ipAddress.To4(); shrunkIP != nil { 18 | ipAddress = shrunkIP 19 | } 20 | ipAddresses = append(ipAddresses, ipAddress) 21 | } 22 | *reply = hypervisor.ListVMsResponse{IpAddresses: ipAddresses} 23 | return nil 24 | } 25 | -------------------------------------------------------------------------------- /hypervisor/rpcd/listVolumeDirectories.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ListVolumeDirectories(conn *srpc.Conn, 10 | request hypervisor.ListVolumeDirectoriesRequest, 11 | reply *hypervisor.ListVolumeDirectoriesResponse) error { 12 | directories, err := t.listVolumeDirectories(conn) 13 | *reply = hypervisor.ListVolumeDirectoriesResponse{directories, 14 | errors.ErrorToString(err)} 15 | return nil 16 | } 17 | 18 | func (t *srpcType) listVolumeDirectories(conn *srpc.Conn) ([]string, error) { 19 | if err := testIfLoopback(conn); err != nil { 20 | return nil, err 21 | } 22 | return t.manager.ListVolumeDirectories(), nil 23 | } 24 | -------------------------------------------------------------------------------- /hypervisor/rpcd/migrateVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/hypervisor" 6 | ) 7 | 8 | func (t *srpcType) MigrateVm(conn *srpc.Conn) error { 9 | if err := t.manager.MigrateVm(conn); err != nil { 10 | return conn.Encode(hypervisor.MigrateVmResponse{Error: err.Error()}) 11 | } 12 | return conn.Encode(hypervisor.MigrateVmResponse{Final: true}) 13 | } 14 | -------------------------------------------------------------------------------- /hypervisor/rpcd/patchVmImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) PatchVmImage(conn *srpc.Conn) error { 10 | var request hypervisor.PatchVmImageRequest 11 | if err := conn.Decode(&request); err != nil { 12 | return err 13 | } 14 | return conn.Encode(hypervisor.PatchVmImageResponse{ 15 | Error: errors.ErrorToString(t.manager.PatchVmImage(conn, request)), 16 | Final: true, 17 | }) 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /hypervisor/rpcd/prepareVmForMigration.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) PrepareVmForMigration(conn *srpc.Conn, 10 | request hypervisor.PrepareVmForMigrationRequest, 11 | reply *hypervisor.PrepareVmForMigrationResponse) error { 12 | *reply = hypervisor.PrepareVmForMigrationResponse{ 13 | Error: errors.ErrorToString( 14 | t.manager.PrepareVmForMigration(request.IpAddress, 15 | conn.GetAuthInformation(), request.AccessToken, 16 | request.Enable)), 17 | } 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /hypervisor/rpcd/replaceVmImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | ) 6 | 7 | func (t *srpcType) ReplaceVmImage(conn *srpc.Conn) error { 8 | return t.manager.ReplaceVmImage(conn, conn.GetAuthInformation()) 9 | } 10 | -------------------------------------------------------------------------------- /hypervisor/rpcd/replaceVmUserData.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) ReplaceVmUserData(conn *srpc.Conn, 10 | request hypervisor.ReplaceVmUserDataRequest, 11 | reply *hypervisor.ReplaceVmUserDataResponse) error { 12 | response := hypervisor.ReplaceVmUserDataResponse{ 13 | errors.ErrorToString(t.manager.ReplaceVmUserData(request.IpAddress, 14 | conn, request.Size, conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/restoreVmFromSnapshot.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) RestoreVmFromSnapshot(conn *srpc.Conn, 10 | request hypervisor.RestoreVmFromSnapshotRequest, 11 | reply *hypervisor.RestoreVmFromSnapshotResponse) error { 12 | response := hypervisor.RestoreVmFromSnapshotResponse{ 13 | errors.ErrorToString(t.manager.RestoreVmFromSnapshot(request.IpAddress, 14 | conn.GetAuthInformation(), request.ForceIfNotStopped))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/restoreVmImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) RestoreVmImage(conn *srpc.Conn, 10 | request hypervisor.RestoreVmImageRequest, 11 | reply *hypervisor.RestoreVmImageResponse) error { 12 | response := hypervisor.RestoreVmImageResponse{ 13 | errors.ErrorToString(t.manager.RestoreVmImage(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/restoreVmUserData.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) RestoreVmUserData(conn *srpc.Conn, 10 | request hypervisor.RestoreVmUserDataRequest, 11 | reply *hypervisor.RestoreVmUserDataResponse) error { 12 | response := hypervisor.RestoreVmUserDataResponse{ 13 | errors.ErrorToString(t.manager.RestoreVmUserData(request.IpAddress, 14 | conn.GetAuthInformation()))} 15 | *reply = response 16 | return nil 17 | } 18 | -------------------------------------------------------------------------------- /hypervisor/rpcd/snapshotVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) SnapshotVm(conn *srpc.Conn, 10 | request hypervisor.SnapshotVmRequest, 11 | reply *hypervisor.SnapshotVmResponse) error { 12 | err := t.manager.SnapshotVm(request.IpAddress, conn.GetAuthInformation(), 13 | request.ForceIfNotStopped, request.RootOnly) 14 | *reply = hypervisor.SnapshotVmResponse{errors.ErrorToString(err)} 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /hypervisor/rpcd/startVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) StartVm(conn *srpc.Conn, 10 | request hypervisor.StartVmRequest, 11 | reply *hypervisor.StartVmResponse) error { 12 | dhcpTimedOut, err := t.manager.StartVm(request.IpAddress, 13 | conn.GetAuthInformation(), request.AccessToken, request.DhcpTimeout) 14 | response := hypervisor.StartVmResponse{dhcpTimedOut, 15 | errors.ErrorToString(err)} 16 | *reply = response 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /hypervisor/rpcd/stopVm.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) StopVm(conn *srpc.Conn, 10 | request hypervisor.StopVmRequest, reply *hypervisor.StopVmResponse) error { 11 | response := hypervisor.StopVmResponse{ 12 | errors.ErrorToString(t.manager.StopVm(request.IpAddress, 13 | conn.GetAuthInformation(), request.AccessToken))} 14 | *reply = response 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /hypervisor/rpcd/updateSubnets.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/hypervisor" 7 | ) 8 | 9 | func (t *srpcType) UpdateSubnets(conn *srpc.Conn, 10 | request hypervisor.UpdateSubnetsRequest, 11 | reply *hypervisor.UpdateSubnetsResponse) error { 12 | *reply = hypervisor.UpdateSubnetsResponse{ 13 | errors.ErrorToString(t.manager.UpdateSubnets(request))} 14 | return nil 15 | } 16 | -------------------------------------------------------------------------------- /imagebuilder/builder/variables.go: -------------------------------------------------------------------------------- 1 | package builder 2 | 3 | func (b *Builder) getVariableFunc( 4 | extraVariables0, extraVariables1 map[string]string) func(string) string { 5 | return func(varName string) string { 6 | if extraVariables0 != nil { 7 | if varValue, ok := extraVariables0[varName]; ok { 8 | return varValue 9 | } 10 | } 11 | if extraVariables1 != nil { 12 | if varValue, ok := extraVariables1[varName]; ok { 13 | return varValue 14 | } 15 | } 16 | return b.variables[varName] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /imagebuilder/client/api.go: -------------------------------------------------------------------------------- 1 | package client 2 | 3 | import ( 4 | "io" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | proto "github.com/Symantec/Dominator/proto/imaginator" 8 | ) 9 | 10 | func BuildImage(client *srpc.Client, request proto.BuildImageRequest, 11 | response *proto.BuildImageResponse, logWriter io.Writer) error { 12 | return buildImage(client, request, response, logWriter) 13 | } 14 | -------------------------------------------------------------------------------- /imagebuilder/httpd/showImageStream.go: -------------------------------------------------------------------------------- 1 | package httpd 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "net/http" 7 | ) 8 | 9 | func (s state) showImageStreamHandler(w http.ResponseWriter, 10 | req *http.Request) { 11 | writer := bufio.NewWriter(w) 12 | defer writer.Flush() 13 | streamName := req.URL.RawQuery 14 | fmt.Fprintf(writer, "
") 23 | image.FileSystem.List(writer) 24 | fmt.Fprintln(writer, "") 25 | } 26 | fmt.Fprintln(writer, "") 27 | } 28 | -------------------------------------------------------------------------------- /imageserver/httpd/listObject.go: -------------------------------------------------------------------------------- 1 | package httpd 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | 7 | "github.com/Symantec/Dominator/lib/hash" 8 | "github.com/Symantec/Dominator/lib/objectserver/filesystem" 9 | ) 10 | 11 | func listObject(writer io.Writer, objSrv *filesystem.ObjectServer, 12 | hashP *hash.Hash) { 13 | _, reader, err := objSrv.GetObject(*hashP) 14 | if err != nil { 15 | fmt.Fprintln(writer, err) 16 | return 17 | } 18 | defer reader.Close() 19 | fmt.Fprintln(writer, "
") 20 | io.Copy(writer, reader) 21 | fmt.Fprintln(writer, "") 22 | } 23 | -------------------------------------------------------------------------------- /imageserver/rpcd/checkDirectory.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/imageserver" 6 | ) 7 | 8 | func (t *srpcType) CheckDirectory(conn *srpc.Conn, 9 | request imageserver.CheckDirectoryRequest, 10 | reply *imageserver.CheckDirectoryResponse) error { 11 | response := imageserver.CheckDirectoryResponse{ 12 | t.imageDataBase.CheckDirectory(request.DirectoryName)} 13 | *reply = response 14 | return nil 15 | } 16 | -------------------------------------------------------------------------------- /imageserver/rpcd/checkImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/srpc" 5 | "github.com/Symantec/Dominator/proto/imageserver" 6 | ) 7 | 8 | func (t *srpcType) CheckImage(conn *srpc.Conn, 9 | request imageserver.CheckImageRequest, 10 | reply *imageserver.CheckImageResponse) error { 11 | var response imageserver.CheckImageResponse 12 | response.ImageExists = t.imageDataBase.CheckImage(request.ImageName) 13 | *reply = response 14 | return nil 15 | } 16 | -------------------------------------------------------------------------------- /imageserver/rpcd/chownDirectory.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "errors" 5 | "os/user" 6 | 7 | "github.com/Symantec/Dominator/lib/srpc" 8 | "github.com/Symantec/Dominator/proto/imageserver" 9 | ) 10 | 11 | func (t *srpcType) ChownDirectory(conn *srpc.Conn, 12 | request imageserver.ChangeOwnerRequest, 13 | reply *imageserver.ChangeOwnerResponse) error { 14 | username := conn.Username() 15 | if username == "" { 16 | return errors.New("no username: unauthenticated connection") 17 | } 18 | if request.OwnerGroup != "" { 19 | if _, err := user.LookupGroup(request.OwnerGroup); err != nil { 20 | return err 21 | } 22 | } 23 | t.logger.Printf("ChownDirectory(%s) to: \"%s\" by %s\n", 24 | request.DirectoryName, request.OwnerGroup, username) 25 | return t.imageDataBase.ChownDirectory(request.DirectoryName, 26 | request.OwnerGroup, conn.GetAuthInformation()) 27 | } 28 | -------------------------------------------------------------------------------- /imageserver/rpcd/deleteImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/Symantec/Dominator/lib/srpc" 7 | "github.com/Symantec/Dominator/proto/imageserver" 8 | ) 9 | 10 | func (t *srpcType) DeleteImage(conn *srpc.Conn, 11 | request imageserver.DeleteImageRequest, 12 | reply *imageserver.DeleteImageResponse) error { 13 | username := conn.Username() 14 | if err := t.checkMutability(); err != nil { 15 | return err 16 | } 17 | if !t.imageDataBase.CheckImage(request.ImageName) { 18 | return errors.New("image does not exist") 19 | } 20 | if username == "" { 21 | t.logger.Printf("DeleteImage(%s)\n", request.ImageName) 22 | } else { 23 | t.logger.Printf("DeleteImage(%s) by %s\n", request.ImageName, username) 24 | } 25 | return t.imageDataBase.DeleteImage(request.ImageName, 26 | conn.GetAuthInformation()) 27 | } 28 | -------------------------------------------------------------------------------- /imageserver/rpcd/deleteUnreferencedObjects.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/format" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/imageserver" 7 | ) 8 | 9 | func (t *srpcType) DeleteUnreferencedObjects(conn *srpc.Conn, 10 | request imageserver.DeleteUnreferencedObjectsRequest, 11 | reply *imageserver.DeleteUnreferencedObjectsResponse) error { 12 | username := conn.Username() 13 | if username == "" { 14 | t.logger.Printf("DeleteUnreferencedObjects(%d%%, %s)\n", 15 | request.Percentage, format.FormatBytes(request.Bytes)) 16 | } else { 17 | t.logger.Printf("DeleteUnreferencedObjects(%d%%, %s) by %s\n", 18 | request.Percentage, format.FormatBytes(request.Bytes), username) 19 | } 20 | return t.imageDataBase.DeleteUnreferencedObjects(request.Percentage, 21 | request.Bytes) 22 | } 23 | -------------------------------------------------------------------------------- /imageserver/rpcd/findLatestImage.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "github.com/Symantec/Dominator/lib/errors" 5 | "github.com/Symantec/Dominator/lib/srpc" 6 | "github.com/Symantec/Dominator/proto/imageserver" 7 | ) 8 | 9 | func (t *srpcType) FindLatestImage(conn *srpc.Conn, 10 | request imageserver.FindLatestImageRequest, 11 | reply *imageserver.FindLatestImageResponse) error { 12 | imageName, err := t.imageDataBase.FindLatestImage(request.DirectoryName, 13 | request.IgnoreExpiringImages) 14 | *reply = imageserver.FindLatestImageResponse{ 15 | ImageName: imageName, 16 | Error: errors.ErrorToString(err), 17 | } 18 | return nil 19 | } 20 | -------------------------------------------------------------------------------- /imageserver/rpcd/html.go: -------------------------------------------------------------------------------- 1 | package rpcd 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | ) 7 | 8 | func (hw *htmlWriter) writeHtml(writer io.Writer) { 9 | fmt.Fprintf(writer, "Replication clients: %d