diff --git a/AUTHORS.md b/AUTHORS.md index ba5f2dbad..bd5098d89 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,14 +1,16 @@ # Authors -This project would not be possible without the generous contributions of many people. -Thank you! If you have contributed in any way, but do not see your name here, please open a PR to add yourself (in alphabetical order by last name)! +This project would not be possible without the generous contributions of many people. Thank you! If you have contributed +in any way, but do not see your name here, please open a PR to add yourself (in alphabetical order by last name)! ## DNS SMEs + - Joe Crowe - David Back - Hong Ye ## Contributors + - Mike Ball - Tommy Barker - Robert Barrimond @@ -17,6 +19,7 @@ Thank you! If you have contributed in any way, but do not see your name here, pl - Maulon Byron - Shirlette Chambers - Varsha Chandrashekar +- Paul Cleary - Peter Cline - Kemar Cockburn - Luke Cori @@ -30,6 +33,7 @@ Thank you! If you have contributed in any way, but do not see your name here, pl - Krista Khare - Patrick Lee - Sheree Liu +- Michael Ly - Deepak Mohanakrishnan - Jon Moore - Palash Nigam @@ -41,6 +45,7 @@ Thank you! If you have contributed in any way, but do not see your name here, pl - Timo Schmid - Trent Schmidt - Ghafar Shah +- Rebecca Star - Jess Stodola - Juan Valencia - Anastasia Vishnyakova @@ -48,3 +53,4 @@ Thank you! If you have contributed in any way, but do not see your name here, pl - Fei Wan - Andrew Wang - Peter Willis +- Britney Wright diff --git a/build.sbt b/build.sbt index 168cb7306..966b1ced4 100644 --- a/build.sbt +++ b/build.sbt @@ -281,13 +281,13 @@ lazy val docSettings = Seq( micrositeGithubOwner := "vinyldns", micrositeGithubRepo := "vinyldns", micrositeName := "VinylDNS", - micrositeDescription := "DNS Governance", + micrositeDescription := "DNS Automation and Governance", micrositeAuthor := "VinylDNS", - micrositeHomepage := "http://vinyldns.io", + micrositeHomepage := "https://vinyldns.io", micrositeDocumentationUrl := "/api", - micrositeGitterChannelUrl := "vinyldns/Lobby", - micrositeTwitterCreator := "@vinyldns", micrositeDocumentationLabelDescription := "API Documentation", + micrositeHighlightLanguages ++= Seq("json"), + micrositeGitterChannel := false, micrositeExtraMdFiles := Map( file("CONTRIBUTING.md") -> ExtraMdFileConfig( "contributing.md", @@ -300,8 +300,6 @@ lazy val docSettings = Seq( ghpagesNoJekyll := false, fork in mdoc := true, mdocIn := (sourceDirectory in Compile).value / "mdoc", - micrositeCssDirectory := (resourceDirectory in Compile).value / "microsite" / "css", - micrositeCompilingDocsTool := WithMdoc, micrositeFavicons := Seq( MicrositeFavicon("favicon16x16.png", "16x16"), MicrositeFavicon("favicon32x32.png", "32x32") @@ -313,7 +311,7 @@ lazy val docSettings = Seq( ) ), micrositeFooterText := None, - micrositeHighlightTheme := "atom-one-light", + micrositeHighlightTheme := "hybrid", includeFilter in makeSite := "*.html" | "*.css" | "*.png" | "*.jpg" | "*.jpeg" | "*.gif" | "*.js" | "*.swf" | "*.md" | "*.webm" | "*.ico" | "CNAME" | "*.yml" | "*.svg" | "*.json" | "*.csv" ) diff --git a/modules/api/src/test/scala/vinyldns/api/CatsHelpers.scala b/modules/api/src/test/scala/vinyldns/api/CatsHelpers.scala index ee82bd253..c3608c754 100644 --- a/modules/api/src/test/scala/vinyldns/api/CatsHelpers.scala +++ b/modules/api/src/test/scala/vinyldns/api/CatsHelpers.scala @@ -32,7 +32,7 @@ trait CatsHelpers { private implicit val cs: ContextShift[IO] = IO.contextShift(scala.concurrent.ExecutionContext.global) - def await[E, T](f: => IO[T], duration: FiniteDuration = 1.second): T = { + def await[E, T](f: => IO[T], duration: FiniteDuration = 60.seconds): T = { val i: IO[Either[E, T]] = f.attempt.map { case Right(ok) => Right(ok.asInstanceOf[T]) case Left(e) => Left(e.asInstanceOf[E]) @@ -43,18 +43,18 @@ trait CatsHelpers { // Waits for the future to complete, then returns the value as an Either[Throwable, T] def awaitResultOf[E, T]( f: => IO[Either[E, T]], - duration: FiniteDuration = 1.second + duration: FiniteDuration = 60.seconds ): Either[E, T] = { val timeOut = IO.sleep(duration) *> IO(new RuntimeException("Timed out waiting for result")) IO.race(timeOut, f).unsafeRunSync().toOption.get } // Assumes that the result of the future operation will be successful, this will fail on a left disjunction - def rightResultOf[E, T](f: => IO[Either[E, T]], duration: FiniteDuration = 1.second): T = + def rightResultOf[E, T](f: => IO[Either[E, T]], duration: FiniteDuration = 60.seconds): T = rightValue(awaitResultOf[E, T](f, duration)) // Assumes that the result of the future operation will fail, this will error on a right disjunction - def leftResultOf[E, T](f: => IO[Either[E, T]], duration: FiniteDuration = 1.second): E = + def leftResultOf[E, T](f: => IO[Either[E, T]], duration: FiniteDuration = 60.seconds): E = leftValue(awaitResultOf(f, duration)) def leftValue[E, T](t: Either[E, T]): E = t match { diff --git a/modules/api/src/test/scala/vinyldns/api/backend/dns/DnsBackendSpec.scala b/modules/api/src/test/scala/vinyldns/api/backend/dns/DnsBackendSpec.scala index d8cc2276e..a095c41f3 100644 --- a/modules/api/src/test/scala/vinyldns/api/backend/dns/DnsBackendSpec.scala +++ b/modules/api/src/test/scala/vinyldns/api/backend/dns/DnsBackendSpec.scala @@ -16,8 +16,6 @@ package vinyldns.api.backend.dns -import java.net.{InetAddress, SocketAddress} - import cats.scalatest.EitherMatchers import org.joda.time.DateTime import org.mockito.ArgumentCaptor @@ -36,6 +34,7 @@ import vinyldns.core.domain.record.RecordType._ import vinyldns.core.domain.record._ import vinyldns.core.domain.zone.{Zone, ZoneConnection} +import java.net.{InetAddress, SocketAddress} import scala.collection.JavaConverters._ class DnsBackendSpec @@ -93,7 +92,9 @@ class DnsBackendSpec ): Either[Throwable, DnsQuery] = name match { case "try-again" => - Right(new DnsQuery(new Lookup("try-again.vinyldns.", 0, 0), new Name(testZone.name))) + val lookup = new Lookup("try-again.vinyldns.", 0, 0) + lookup.setResolver(mockResolver) + Right(new DnsQuery(lookup, new Name(testZone.name))) case _ => Right(mockDnsQuery) } } @@ -101,7 +102,9 @@ class DnsBackendSpec override def beforeEach(): Unit = { doReturn(mockMessage).when(mockMessage).clone() - doReturn(new java.util.ArrayList[DNS.Record](0)).when(mockMessage).getSection(DNS.Section.ADDITIONAL) + doReturn(new java.util.ArrayList[DNS.Record](0)) + .when(mockMessage) + .getSection(DNS.Section.ADDITIONAL) doReturn(DNS.Rcode.NOERROR).when(mockMessage).getRcode doReturn(mockMessage).when(mockResolver).send(messageCaptor.capture()) doReturn(DNS.Lookup.SUCCESSFUL).when(mockDnsQuery).result @@ -609,6 +612,12 @@ class DnsBackendSpec "return an error if receiving TRY_AGAIN from lookup error" in { val rsc = addRsChange(rs = testA.copy(name = "try-again")) + val tryAgainMessage = mock[DNS.Message] + val mockHeader = mock[DNS.Header] + doReturn(mockHeader).when(tryAgainMessage).getHeader + doReturn(DNS.Rcode.NOTIMP).when(mockHeader).getRcode + doReturn(tryAgainMessage).when(mockResolver).send(any[DNS.Message]) + underTest .resolve(rsc.recordSet.name, rsc.zone.name, rsc.recordSet.typ) .attempt diff --git a/modules/docs/src/main/mdoc/api/approve-batchchange.md b/modules/docs/src/main/mdoc/api/approve-batchchange.md index 273e3ae74..eeb0d0feb 100644 --- a/modules/docs/src/main/mdoc/api/approve-batchchange.md +++ b/modules/docs/src/main/mdoc/api/approve-batchchange.md @@ -69,7 +69,7 @@ reviewTimestamp | date-time | The timestamp (UTC) of when the batch change was #### EXAMPLE RESPONSE -``` +```json { "userId": "vinyl", "userName": "vinyl201", diff --git a/modules/docs/src/main/mdoc/api/batchchange-errors.md b/modules/docs/src/main/mdoc/api/batchchange-errors.md index 8935b07f7..dd649eda5 100644 --- a/modules/docs/src/main/mdoc/api/batchchange-errors.md +++ b/modules/docs/src/main/mdoc/api/batchchange-errors.md @@ -26,7 +26,7 @@ in the DNS backend. #### EXAMPLE ERROR RESPONSE BY CHANGE -``` +```json [ { "changeType": "Add", @@ -46,7 +46,7 @@ in the DNS backend. "cname": "test.example.com." }, "errors": [ - "Record with name "duplicate.example.com." is not unique in the batch change. CNAME record cannot use duplicate name." + "Record with name \"duplicate.example.com.\" is not unique in the batch change. CNAME record cannot use duplicate name." ] }, { @@ -60,7 +60,7 @@ in the DNS backend. }, { "changeType": "Add", - "inputName": "bad-ttl-and-invalid-name$.sample.com.”, + "inputName": "bad-ttl-and-invalid-name$.sample.com.", "type": "A", "ttl": 29, "record": { @@ -143,7 +143,7 @@ Zone Discovery Failed: zone for "" does not exist in VinylDNS. If zone ex Given an inputName, VinylDNS will determine the record and zone name for the requested change. For most records, the record names are the same as the zone name (apex), or split at at the first '.', so the inputName 'rname.zone.name.com' will be split into record name 'rname' and zone name 'zone.name.com' (or 'rname.zone.name.com' for both the record and zone name if it's an apex record). -For PTR records, there is logic to determine the appropriate reverse zone from the given IP address. +For `PTR` records, there is logic to determine the appropriate reverse zone from the given IP address. If this logic cannot find a matching zone in VinylDNS, you will see this error. In that case, you need to connect to the zone in VinylDNS. @@ -350,7 +350,7 @@ CNAME conflict: CNAME record names must be unique. Existing record with name " @@ -445,7 +445,7 @@ CNAME cannot be the same name as zone "". ##### Details: -CNAME records cannot be `@` or the same name as the zone. +`CNAME` records cannot be `@` or the same name as the zone. ### FULL-REQUEST ERRORS @@ -505,7 +505,7 @@ If there are issues with the JSON provided in a batch change request, errors wil ##### EXAMPLE ERROR MESSAGES: -``` +```json { "errors": [ "Missing BatchChangeInput.changes" @@ -522,7 +522,7 @@ If there are issues with the JSON provided in a batch change request, errors wil { "errors": [ - “Invalid RecordType” + "Invalid RecordType"" ] } ``` diff --git a/modules/docs/src/main/mdoc/api/batchchange-model.md b/modules/docs/src/main/mdoc/api/batchchange-model.md index 1d902195d..6aff9bffd 100644 --- a/modules/docs/src/main/mdoc/api/batchchange-model.md +++ b/modules/docs/src/main/mdoc/api/batchchange-model.md @@ -20,7 +20,7 @@ Batch change is an alternative to submitting individual [RecordSet](recordset-mo - The ability to accept multiple changes in a single API call. - The ability to include records of multiple record types across multiple zones. -- Input names are entered as fully-qualified domain names (or IP addresses for **PTR** records), so users don't have to think in record/zone context. +- Input names are entered as fully-qualified domain names (or IP addresses for `PTR` records), so users don't have to think in record/zone context. - All record validations are processed simultaneously. [Fatal errors](batchchange-errors.html#fatal-errors) for any change in the batch will result in a **400** response and none will be applied. - Support for [manual review](../operator/config-api.html#additional-configuration-settings) if enabled in your VinylDNS instance. @@ -35,7 +35,7 @@ A batch change consists of multiple single changes which can be a combination of To update an existing record, you must delete the record first and add the record again with the updated changes. Batch changes are also susceptible to the following restrictions: -- Current supported record types for batch change are: **A**, **AAAA**, **CNAME**, and **PTR**. +- Current supported record types for batch change are: `A`, `AAAA`, `CNAME`, and `PTR`. - Batch change requests must contain at least one change. - The maximum number of single changes within a batch change depends on the instance of VinylDNS. Contact your VinylDNS administrators to find the batch change limit for your instance. - Access permissions will follow existing rules (admin group or ACL access). Note that an update (delete and add of the same record name, zone and record type combination) requires **Write** access. @@ -74,7 +74,7 @@ name | type | description | ------------ | :------------ | :---------- | changeType | ChangeInputType | Type of change input. Can either be an **Add** or **DeleteRecordSet**. [See more details](#changetype-values) about behavior of `changeType` interaction. | inputName | string | The fully-qualified domain name of the record which was provided in the create batch request. | -type | RecordType | Type of DNS record, supported records for batch changes are currently: **A**, **AAAA**, **CNAME**, and **PTR**. | +type | RecordType | Type of DNS record, supported records for batch changes are currently: `A`, `AAAA`, `CNAME`, and `PTR`. | ttl | long | The time-to-live in seconds. | record | [RecordData](recordset-model.html#record-data) | The data added for this record, which varies by record type. | status | SingleChangeStatus | Status for this change. Can be one of: **Pending**, **Complete**, **Failed**, **NeedsReview** or **Rejected**. | @@ -94,7 +94,7 @@ name | type | description | ------------ | :------------ | :---------- | changeType | ChangeInputType | Type of change input. Can either be an **Add** or **DeleteRecordSet**. [See more details](#changetype-values) about behavior of `changeType` interaction. | inputName | string | The fully-qualified domain name of the record which was provided in the create batch request. | -type | RecordType | Type of DNS record, supported records for batch changes are currently: **A**, **AAAA**, **CNAME**, and **PTR**. | +type | RecordType | Type of DNS record, supported records for batch changes are currently: `A`, `AAAA`, `CNAME`, and `PTR`. | record | [RecordData](recordset-model.html#record-data) | Optional. The data deleted for this record, which varies by record type. If not provided, the entire DNS recordset was deleted. | status | SingleChangeStatus | Status for this change. Can be one of: **Pending**, **Complete**, **Failed**, **NeedsReview** or **Rejected**. | recordName | string | The name of the record. Record names for the apex will be match the zone name (including terminating dot). | @@ -124,7 +124,7 @@ There are two valid `changeType`s for a `SingleChange`: **Add** and **DeleteReco Successful batch change response example with a [SingleAddChange](#singleaddchange-attributes) and a [SingleDeleteRRSetChange](#singledeleterrsetchange-attributes). -``` +```json { "userId": "vinyl", "userName": "vinyl201", diff --git a/modules/docs/src/main/mdoc/api/create-batchchange.md b/modules/docs/src/main/mdoc/api/create-batchchange.md index cad5b26f8..258ccc172 100644 --- a/modules/docs/src/main/mdoc/api/create-batchchange.md +++ b/modules/docs/src/main/mdoc/api/create-batchchange.md @@ -8,7 +8,7 @@ section: "api" Creates a batch change with [SingleAddChanges](batchchange-model.html#singleaddchange-attributes) and/or [SingleDeleteRRSetChanges](batchchange-model.html#singledeleterrsetchange-attributes) across different zones. A delete and add of the same record will be treated as an update on that record set. Regardless of the input order in the batch change, all deletes for the same recordset will be logically applied before the adds. -Current supported record types for creating a batch change are: **A**, **AAAA**, **CNAME**, **MX**, **PTR**, **TXT**. A batch must contain at least one change and no more than 20 changes. +Current supported record types for creating a batch change are: `A`, `AAAA`, `CNAME`, `MX`, `PTR`, `TXT`. A batch must contain at least one change and no more than 20 changes. Supported record types for records in shared zones may vary. Contact your VinylDNS administrators to find the allowed record types. This does not apply to zone administrators or users with specific ACL access rules. @@ -33,8 +33,8 @@ allowManualReview | boolean | no | Optional override to control wheth name | type | required? | description | ------------ | :------------ | ----------- | :---------- | changeType | ChangeInputType | yes | Type of change input. Must be set to **Add** for *AddChangeInput*. | -inputName | string | yes | The fully qualified domain name of the record being added. For **PTR**, the input name is a valid IPv4 or IPv6 address. | -type | RecordType | yes | Type of DNS record. Supported records for batch changes are currently: **A**, **AAAA**, **CNAME**, and **PTR**. | +inputName | string | yes | The fully qualified domain name of the record being added. For `PTR`, the input name is a valid IPv4 or IPv6 address. | +type | RecordType | yes | Type of DNS record. Supported records for batch changes are currently: `A`, `AAAA`, `CNAME`, and `PTR`. | ttl | long | no | The time-to-live in seconds. The minimum and maximum values are 30 and 2147483647, respectively. If excluded, this will be set to the system default for new adds, or the existing TTL for updates | record | [RecordData](recordset-model.html#record-data) | yes | The data for the record. | @@ -44,12 +44,12 @@ name | type | required? | description | ------------ | :------------ | ----------- | :---------- | changeType | ChangeInputType | yes | Type of change input. Must be **DeleteRecordSet** for *DeleteChangeInput*. | inputName | string | yes | The fully qualified domain name of the record being deleted. | -type | RecordType | yes | Type of DNS record. Supported records for batch changes are currently: **A**, **AAAA**, **CNAME**, and **PTR**. | +type | RecordType | yes | Type of DNS record. Supported records for batch changes are currently: `A`, `AAAA`, `CNAME`, and `PTR`. | record | [RecordData](recordset-model.html#record-data) | no | The data for the record. If specified, only this DNS entry for the existing DNS recordset will be deleted; if unspecified, the entire DNS recordset will be deleted. | #### EXAMPLE HTTP REQUEST -``` +```json { "comments": "this is optional", "ownerGroupId": "f42385e4-5675-38c0-b42f-64105e743bfe", @@ -98,7 +98,7 @@ record | [RecordData](recordset-model.html#record-data) | no | Th } ``` -The first two items in the changes list are SingleAddChanges of an **A** record and a **PTR** record. Note that for the **PTR** record, the *inputName* is a valid IP address. The third item is a delete of a **CNAME** record. The last two items represent an update (delete & add) of an **AAAA** record with the fully qualified domain name "update.another.example.com.". +The first two items in the changes list are SingleAddChanges of an `A` record and a `PTR` record. Note that for the `PTR` record, the *inputName* is a valid IP address. The third item is a delete of a `CNAME` record. The last two items represent an update (delete & add) of an `AAAA` record with the fully qualified domain name "update.another.example.com.". #### HTTP RESPONSE TYPES @@ -121,7 +121,7 @@ On success, the response from create batch change includes the fields the user i #### EXAMPLE RESPONSE -``` +```json { "userId": "vinyl", "userName": "vinyl201", diff --git a/modules/docs/src/main/mdoc/api/create-group.md b/modules/docs/src/main/mdoc/api/create-group.md index 680d695c3..a535e74ed 100644 --- a/modules/docs/src/main/mdoc/api/create-group.md +++ b/modules/docs/src/main/mdoc/api/create-group.md @@ -24,7 +24,7 @@ admins | Array of User id objects | yes | Set of User ids #### EXAMPLE HTTP REQUEST -``` +```json { "name": "some-group", "email": "test@example.com", @@ -67,7 +67,7 @@ admins | Array of User ID objects | IDs of admins of the group | #### EXAMPLE RESPONSE -``` +```json { "id": "6f8afcda-7529-4cad-9f2d-76903f4b1aca", "name": "some-group", diff --git a/modules/docs/src/main/mdoc/api/create-recordset.md b/modules/docs/src/main/mdoc/api/create-recordset.md index 368e4eed4..ba6781577 100644 --- a/modules/docs/src/main/mdoc/api/create-recordset.md +++ b/modules/docs/src/main/mdoc/api/create-recordset.md @@ -24,7 +24,7 @@ records | array of record data | yes | record data for recordset, see [Re ownerGroupId | string | no | Record ownership assignment, applicable if the recordset is in a [shared zone](zone-model.html#shared-zones) | #### EXAMPLE HTTP REQUEST -``` +```json { "name": "foo", "type": "A", @@ -66,7 +66,7 @@ singleBatchChangeIds | array of SingleBatchChange Id objects | If the recordse #### EXAMPLE RESPONSE -``` +```json { "zone": { "name": "vinyl.", diff --git a/modules/docs/src/main/mdoc/api/create-zone.md b/modules/docs/src/main/mdoc/api/create-zone.md index d30a8f6fa..c97c3da71 100644 --- a/modules/docs/src/main/mdoc/api/create-zone.md +++ b/modules/docs/src/main/mdoc/api/create-zone.md @@ -18,7 +18,7 @@ if no info is provided the default VinylDNS connections will be used **zone fields** - adminGroupId, name, and email are required - refer to [zone model](zone-model.html) | #### EXAMPLE HTTP REQUEST -``` +```json { "adminGroupId": "9b22b686-54bc-47fb-a8f8-cdc48e6d04ae", "name": "dummy.", @@ -49,7 +49,7 @@ id | string | The ID of the change. This is not the ID of the #### EXAMPLE RESPONSE -``` +```json { "status": "Pending", "zone": { diff --git a/modules/docs/src/main/mdoc/api/delete-group.md b/modules/docs/src/main/mdoc/api/delete-group.md index 9eaab294c..30cb3a1db 100644 --- a/modules/docs/src/main/mdoc/api/delete-group.md +++ b/modules/docs/src/main/mdoc/api/delete-group.md @@ -37,7 +37,7 @@ admins | Array of User ID objects | IDs of admins of the group | #### EXAMPLE RESPONSE -``` +```json { "id": "6f8afcda-7529-4cad-9f2d-76903f4b1aca", "name": "some-group", diff --git a/modules/docs/src/main/mdoc/api/delete-recordset.md b/modules/docs/src/main/mdoc/api/delete-recordset.md index 1d1242e59..aa4d05c7b 100644 --- a/modules/docs/src/main/mdoc/api/delete-recordset.md +++ b/modules/docs/src/main/mdoc/api/delete-recordset.md @@ -36,7 +36,7 @@ id | string | The ID of the change. This is not the ID of the #### EXAMPLE RESPONSE -``` +```json { "zone": { "name": "vinyl.", diff --git a/modules/docs/src/main/mdoc/api/delete-zone.md b/modules/docs/src/main/mdoc/api/delete-zone.md index a88517d65..3295fe2a2 100644 --- a/modules/docs/src/main/mdoc/api/delete-zone.md +++ b/modules/docs/src/main/mdoc/api/delete-zone.md @@ -40,7 +40,7 @@ status | string | The status of the zone change | #### EXAMPLE RESPONSE -``` +```json { "status": "Pending", "zone": { diff --git a/modules/docs/src/main/mdoc/api/get-batchchange.md b/modules/docs/src/main/mdoc/api/get-batchchange.md index f3bd10ded..a26570a48 100644 --- a/modules/docs/src/main/mdoc/api/get-batchchange.md +++ b/modules/docs/src/main/mdoc/api/get-batchchange.md @@ -50,7 +50,7 @@ cancelledTimestamp | date-time | Optional timestamp (UTC) if the batch change wa #### EXAMPLE RESPONSE -``` +```json { "userId": "vinyl", "userName": "vinyl201", diff --git a/modules/docs/src/main/mdoc/api/get-group.md b/modules/docs/src/main/mdoc/api/get-group.md index 9b6f60e0e..fa9725161 100644 --- a/modules/docs/src/main/mdoc/api/get-group.md +++ b/modules/docs/src/main/mdoc/api/get-group.md @@ -35,7 +35,7 @@ admins | Array of User Id objects | Ids of admins of the group | #### EXAMPLE RESPONSE -``` +```json { "id": "6f8afcda-7529-4cad-9f2d-76903f4b1aca", "name": "some-group", diff --git a/modules/docs/src/main/mdoc/api/get-recordset-change.md b/modules/docs/src/main/mdoc/api/get-recordset-change.md index 1ca56de50..a382a4fed 100644 --- a/modules/docs/src/main/mdoc/api/get-recordset-change.md +++ b/modules/docs/src/main/mdoc/api/get-recordset-change.md @@ -37,7 +37,7 @@ singleBatchChangeIds | array of SingleBatchChange ID objects | If the recordse #### EXAMPLE RESPONSE -``` +```json { "zone": { "name": "vinyl.", diff --git a/modules/docs/src/main/mdoc/api/get-recordset.md b/modules/docs/src/main/mdoc/api/get-recordset.md index bfa71aaac..5d1a10e46 100644 --- a/modules/docs/src/main/mdoc/api/get-recordset.md +++ b/modules/docs/src/main/mdoc/api/get-recordset.md @@ -42,7 +42,7 @@ ownerGroupName | string | Name of assigned owner group, if found | #### EXAMPLE RESPONSE -``` +```json { "type": "A", "zoneId": "2467dc05-68eb-4498-a9d5-78d24bb0893c", diff --git a/modules/docs/src/main/mdoc/api/get-zone-by-id.md b/modules/docs/src/main/mdoc/api/get-zone-by-id.md index ecb9605db..7d209d766 100644 --- a/modules/docs/src/main/mdoc/api/get-zone-by-id.md +++ b/modules/docs/src/main/mdoc/api/get-zone-by-id.md @@ -29,7 +29,7 @@ zone | map | refer to [zone model](zone-model.html) | #### EXAMPLE RESPONSE -``` +```json { "zone": { "status": "Active", diff --git a/modules/docs/src/main/mdoc/api/get-zone-by-name.md b/modules/docs/src/main/mdoc/api/get-zone-by-name.md index 6a3cdff08..3b8f76c95 100644 --- a/modules/docs/src/main/mdoc/api/get-zone-by-name.md +++ b/modules/docs/src/main/mdoc/api/get-zone-by-name.md @@ -29,7 +29,7 @@ zone | map | refer to [zone model](zone-model.html) | #### EXAMPLE RESPONSE -``` +```json { "zone": { "status": "Active", diff --git a/modules/docs/src/main/mdoc/api/list-batchchanges.md b/modules/docs/src/main/mdoc/api/list-batchchanges.md index c3034436a..fc18ef369 100644 --- a/modules/docs/src/main/mdoc/api/list-batchchanges.md +++ b/modules/docs/src/main/mdoc/api/list-batchchanges.md @@ -60,7 +60,7 @@ approvalStatus | BatchChangeApprovalStatus | Whether the batch change is cu #### EXAMPLE RESPONSE -``` +```json { "batchChanges": [ { diff --git a/modules/docs/src/main/mdoc/api/list-group-activity.md b/modules/docs/src/main/mdoc/api/list-group-activity.md index b05d85650..4821547f6 100644 --- a/modules/docs/src/main/mdoc/api/list-group-activity.md +++ b/modules/docs/src/main/mdoc/api/list-group-activity.md @@ -48,7 +48,7 @@ changeType | string | The type change, either Create, Update, or Delet #### EXAMPLE RESPONSE -``` +```json { "maxItems": 100, "changes": [ diff --git a/modules/docs/src/main/mdoc/api/list-group-admins.md b/modules/docs/src/main/mdoc/api/list-group-admins.md index 64a978807..a2b68c48e 100644 --- a/modules/docs/src/main/mdoc/api/list-group-admins.md +++ b/modules/docs/src/main/mdoc/api/list-group-admins.md @@ -28,7 +28,7 @@ admins | Array of Users | refer to [membership model](membership-model.ht #### EXAMPLE RESPONSE -``` +```json { "admins": [ { diff --git a/modules/docs/src/main/mdoc/api/list-group-members.md b/modules/docs/src/main/mdoc/api/list-group-members.md index 4d863838a..e864c7b11 100644 --- a/modules/docs/src/main/mdoc/api/list-group-members.md +++ b/modules/docs/src/main/mdoc/api/list-group-members.md @@ -38,7 +38,7 @@ maxItems | integer | maxItems sent in request, default is 100 | #### EXAMPLE RESPONSE -``` +```json { "members": [ { diff --git a/modules/docs/src/main/mdoc/api/list-groups.md b/modules/docs/src/main/mdoc/api/list-groups.md index b12458f61..43dadac01 100644 --- a/modules/docs/src/main/mdoc/api/list-groups.md +++ b/modules/docs/src/main/mdoc/api/list-groups.md @@ -41,7 +41,7 @@ ignoreAccess | boolean | The ignoreAccess parameter that was sent in the #### EXAMPLE RESPONSE -``` +```json { "maxItems": 100, "groups": [ diff --git a/modules/docs/src/main/mdoc/api/list-recordset-changes.md b/modules/docs/src/main/mdoc/api/list-recordset-changes.md index 2e3cbf999..ebd5c0397 100644 --- a/modules/docs/src/main/mdoc/api/list-recordset-changes.md +++ b/modules/docs/src/main/mdoc/api/list-recordset-changes.md @@ -44,7 +44,7 @@ status | string | The status of the change (Pending, Complete, Fai #### EXAMPLE RESPONSE -``` +```json { "recordSetChanges": [ { diff --git a/modules/docs/src/main/mdoc/api/list-recordsets-by-zone.md b/modules/docs/src/main/mdoc/api/list-recordsets-by-zone.md index cd0818669..329f26d55 100644 --- a/modules/docs/src/main/mdoc/api/list-recordsets-by-zone.md +++ b/modules/docs/src/main/mdoc/api/list-recordsets-by-zone.md @@ -45,7 +45,7 @@ nameSort | string | name sort order sent in request #### EXAMPLE RESPONSE -``` +```json { "recordSets": [ { diff --git a/modules/docs/src/main/mdoc/api/list-recordsets-global.md b/modules/docs/src/main/mdoc/api/list-recordsets-global.md index 979348dd2..7ab6bb8a6 100644 --- a/modules/docs/src/main/mdoc/api/list-recordsets-global.md +++ b/modules/docs/src/main/mdoc/api/list-recordsets-global.md @@ -45,7 +45,7 @@ nameSort | string | name sort order sent in request #### EXAMPLE RESPONSE -``` +```json { "recordSets": [ { @@ -66,7 +66,7 @@ nameSort | string | name sort order sent in request "zoneName": "example.com.", "zoneShared": true } - ] + ], "maxItems": 100, "recordNameFilter": "foo*", "recordTypeFilter": [ diff --git a/modules/docs/src/main/mdoc/api/list-zone-changes.md b/modules/docs/src/main/mdoc/api/list-zone-changes.md index 66776d88e..131faaeca 100644 --- a/modules/docs/src/main/mdoc/api/list-zone-changes.md +++ b/modules/docs/src/main/mdoc/api/list-zone-changes.md @@ -40,7 +40,7 @@ maxItems | int | The maxItems parameter that was sent in on the H #### EXAMPLE RESPONSE -``` +```json { "zoneId": "2467dc05-68eb-4498-a9d5-78d24bb0893c", "zoneChanges": [ diff --git a/modules/docs/src/main/mdoc/api/list-zones.md b/modules/docs/src/main/mdoc/api/list-zones.md index dc2ae7c50..ed4c7e4c4 100644 --- a/modules/docs/src/main/mdoc/api/list-zones.md +++ b/modules/docs/src/main/mdoc/api/list-zones.md @@ -41,7 +41,7 @@ ignoreAccess | boolean | The ignoreAccess parameter that was sent in the #### EXAMPLE RESPONSE -``` +```json { "zones": [ { diff --git a/modules/docs/src/main/mdoc/api/membership-model.md b/modules/docs/src/main/mdoc/api/membership-model.md index 878894b8b..78a67498c 100644 --- a/modules/docs/src/main/mdoc/api/membership-model.md +++ b/modules/docs/src/main/mdoc/api/membership-model.md @@ -41,7 +41,7 @@ the group, deleting users from the group, toggling other users' admin statuses ( #### GROUP EXAMPLE -``` +```json { "id": "dc4c7c79-5bbc-41bf-992e-8d6c4ec574c6", "name": "some-group", @@ -80,7 +80,7 @@ To get your access and secret keys, log into the VinylDNS portal and then with t #### USER EXAMPLE -``` +```json { "userName": "jdoe201", "firstName": "John", diff --git a/modules/docs/src/main/mdoc/api/recordset-model.md b/modules/docs/src/main/mdoc/api/recordset-model.md index 3cba2f89f..a0f055f23 100644 --- a/modules/docs/src/main/mdoc/api/recordset-model.md +++ b/modules/docs/src/main/mdoc/api/recordset-model.md @@ -18,7 +18,7 @@ field | type | description | ------------ | :---------- | :---------- | zoneId | string | the id of the zone to which this recordset belongs | name | string | The name of the RecordSet | -type | string | Type of DNS record, supported records are currently: A, AAAA, CNAME, DS, MX, NAPTR, NS, PTR, SOA, SRV, TXT, SSHFP, and SPF. Unsupported types will be given the type UNKNOWN | +type | string | Type of DNS record, supported records are currently: `A`, `AAAA`, `CNAME`, `DS`, `MX`, `NAPTR`, `NS`, `PTR`, `SOA`, `SRV`, `TXT`, `SSHFP`, and `SPF`. Unsupported types will be given the type `UNKNOWN` | ttl | long | the TTL in seconds for the recordset | status | string | *Active* - RecordSet is added is created and ready for use, *Inactive* - RecordSet effects are not applied, *Pending* - RecordSet is queued for creation, *PendingUpdate* - RecordSet is queued for update, *PendingDelete* - RecordSet is queued for delete | created | date-time | The timestamp (UTC) when the recordset was created | @@ -29,7 +29,7 @@ account | string | **DEPRECATED** The account that created the Record #### RecordSet EXAMPLE -``` +```json { "type": "A", "zoneId": "8f8f649f-998e-4428-a029-b4ba5f5bd4ca", @@ -54,72 +54,72 @@ account | string | **DEPRECATED** The account that created the Record ``` #### RECORD DATA INFORMATION -Current supported record types are: A, AAAA, CNAME, DS, MX, NAPTR, NS, PTR, SOA, SRV, TXT, SSHFP, and SPF. +Current supported record types are: `A`, `AAAA`, `CNAME`, `DS`, `MX`, `NAPTR`, `NS`, `PTR`, `SOA`, `SRV`, `TXT`, `SSHFP`, and `SPF`. Each individual record encodes its data in a record data object, in which each record type has different required attributes

-SOA records and NS origin records (record with the same name as the zone) are currently read-only and cannot be created, updated or deleted. -Non-origin NS records can be created or updated for [approved name servers](../operator/config-api.html#additional-configuration-settings) only. Any non-origin NS record can be deleted. +`SOA` records and `NS` origin records (record with the same name as the zone) are currently read-only and cannot be created, updated or deleted. +Non-origin `NS` records can be created or updated for [approved name servers](../operator/config-api.html#additional-configuration-settings) only. Any non-origin `NS` record can be deleted. record type | attribute | type | ------------ | :---------- | :---------- | -A | address | string | +`A` | `address` | `string` |
| | | -AAAA | address | string | +`AAAA` | `address` | `string` |
| | | -CNAME | cname | string | +`CNAME` | `cname` | `string` |
| | | -DS | keytag | integer | -DS | algorithm | integer | -DS | digesttype | integer | -DS | digest | string | +`DS` | `keytag` | `integer` | +`DS` | `algorithm` | `integer` | +`DS` | `digesttype` | `integer` | +`DS` | `digest` | `string` |
| | | -MX | preference | integer | -MX | exchange | string | +`MX` | `preference` | `integer` | +`MX` | `exchange` | `string` |
| | | -NAPTR | order | integer | -NAPTR | preference | integer | -NAPTR | flags | string | -NAPTR | service | string | -NAPTR | regexp | string | -NAPTR | replacement | string | +`NAPTR` | `order` | `integer` | +`NAPTR` | `preference` | `integer` | +`NAPTR` | `flags` | `string` | +`NAPTR` | `service` | `string` | +`NAPTR` | `regexp` | `string` | +`NAPTR` | `replacement` | `string` |
| | | -NS | nsdname | string | +`NS` | `nsdname` | `string` |
| | | -PTR | ptrdname | string | +`PTR` | `ptrdname` | `string` |
| | | -SOA | mname | string | -SOA | rname | string | -SOA | serial | long | -SOA | refresh | long | -SOA | retry | long | -SOA | expire | long | -SOA | minimum | long | +`SOA` | `mname` | `string` | +`SOA` | `rname` | `string` | +`SOA` | `serial` | `long` | +`SOA` | `refresh` | `long` | +`SOA` | `retry` | `long` | +`SOA` | `expire` | `long` | +`SOA` | `minimum` | `long` |
| | | -SPF | text | string | +`SPF` | `text` | `string` |
| | | -SRV | priority | integer | -SRV | weight | integer | -SRV | port | integer | -SRV | target | string | +`SRV` | `priority` | `integer` | +`SRV` | `weight` | `integer` | +`SRV` | `port` | `integer` | +`SRV` | `target` | `string` |
| | | -SSHFP | algorithm | integer | -SSHFP | type | integer | -SSHFP | fingerprint | string | +`SSHFP` | `algorithm` | `integer` | +`SSHFP` | `type` | `integer` | +`SSHFP` | `fingerprint` | `string` |
| | | -TXT | text | string | +`TXT` | `text` | `string` | #### RECORD DATA EXAMPLE Each record is a map that must include all attributes for the data type, the records are stored in the records field of the RecordSet. The records must be an array of at least one record map. All records in the records array must be of the type stored in the typ field of the RecordSet -Use the *@* symbol to point to the zone origin +Use the `@` symbol to point to the zone origin -**CNAME records cannot point to the zone origin, thus the RecordSet name cannot be @ nor the zone origin** +**`CNAME` records cannot point to the zone origin, thus the RecordSet name cannot be `@` nor the zone origin** -Individual SSHFP record: +Individual `SSHFP` record: -``` +```json { "type": "SSHFP", "zoneId": "8f8f649f-998e-4428-a029-b4ba5f5bd4ca", @@ -139,9 +139,9 @@ Individual SSHFP record: } ``` -Multiple SSHFP records: +Multiple `SSHFP` records: -``` +```json { "type": "SSHFP", "zoneId": "8f8f649f-998e-4428-a029-b4ba5f5bd4ca", diff --git a/modules/docs/src/main/mdoc/api/reject-batchchange.md b/modules/docs/src/main/mdoc/api/reject-batchchange.md index cbd2089f6..d99e08de0 100644 --- a/modules/docs/src/main/mdoc/api/reject-batchchange.md +++ b/modules/docs/src/main/mdoc/api/reject-batchchange.md @@ -7,7 +7,7 @@ section: "api" # Reject Batch Change Manually rejects a batch change in pending review status given the batch change ID, resulting in immediate failure. Only -system administrators (ie. support or super user) can manually review a batch change. +system administrators (i.e., support or super user) can manually review a batch change. Note: If [manual review is disabled](../operator/config-api.html#manual-review) in the VinylDNS instance, users trying to access this endpoint will encounter a **404 Not Found** response since it will not exist. @@ -27,7 +27,7 @@ reviewComment | string | no | Optional rejection explanation. | #### EXAMPLE HTTP REQUEST -``` +```json { "reviewComment": "Comments are optional." } @@ -64,7 +64,7 @@ reviewTimestamp | date-time | The timestamp (UTC) of when the batch change was #### EXAMPLE RESPONSE -``` +```json { "userId": "vinyl", "userName": "vinyl201", diff --git a/modules/docs/src/main/mdoc/api/sync-zone.md b/modules/docs/src/main/mdoc/api/sync-zone.md index 5289681d0..74c54c30a 100644 --- a/modules/docs/src/main/mdoc/api/sync-zone.md +++ b/modules/docs/src/main/mdoc/api/sync-zone.md @@ -49,7 +49,7 @@ id | string | The ID of the change. This is not the id of the #### EXAMPLE RESPONSE -``` +```json { "status": "Pending", "zone": { diff --git a/modules/docs/src/main/mdoc/api/update-group.md b/modules/docs/src/main/mdoc/api/update-group.md index 2d0aec938..951e6d2fb 100644 --- a/modules/docs/src/main/mdoc/api/update-group.md +++ b/modules/docs/src/main/mdoc/api/update-group.md @@ -27,7 +27,7 @@ admins | Array of User ID objects | yes | Set of User IDs that #### EXAMPLE HTTP REQUEST -``` +```json { "id": "6f8afcda-7529-4cad-9f2d-76903f4b1aca", "name": "some-group", @@ -76,7 +76,7 @@ admins | Array of User Id objects | Ids of admins of the group | #### EXAMPLE RESPONSE -``` +```json { "id": "6f8afcda-7529-4cad-9f2d-76903f4b1aca", "name": "some-group", diff --git a/modules/docs/src/main/mdoc/api/update-recordset.md b/modules/docs/src/main/mdoc/api/update-recordset.md index ab036a0e9..67cde4eb0 100644 --- a/modules/docs/src/main/mdoc/api/update-recordset.md +++ b/modules/docs/src/main/mdoc/api/update-recordset.md @@ -28,7 +28,7 @@ ownerGroupId | string | sometimes* | Record ownership assignmen *Note: If a recordset has an ownerGroupId you must include that value in the update request, otherwise the update will remove the ownerGroupId value #### EXAMPLE HTTP REQUEST -``` +```json { "id": "dd9c1120-0594-4e61-982e-8ddcbc8b2d21", "name": "already-exists", @@ -72,7 +72,7 @@ singleBatchChangeIds | array of SingleBatchChange ID objects | If the recordse #### EXAMPLE RESPONSE -``` +```json { "zone": { "name": "vinyl.", diff --git a/modules/docs/src/main/mdoc/api/update-zone.md b/modules/docs/src/main/mdoc/api/update-zone.md index 18ca2c0d2..ed3b92e51 100644 --- a/modules/docs/src/main/mdoc/api/update-zone.md +++ b/modules/docs/src/main/mdoc/api/update-zone.md @@ -18,7 +18,7 @@ Updates an existing zone that has already been connected to. Used to update the #### EXAMPLE HTTP REQUEST -``` +```json { "name": "vinyl.", "email": "update@update.com", @@ -63,7 +63,7 @@ status | string | The status of the zone change #### EXAMPLE RESPONSE -``` +```json { "zone": { "name": "vinyl.", diff --git a/modules/docs/src/main/mdoc/api/zone-model.md b/modules/docs/src/main/mdoc/api/zone-model.md index 07a613def..7c96ddd8d 100644 --- a/modules/docs/src/main/mdoc/api/zone-model.md +++ b/modules/docs/src/main/mdoc/api/zone-model.md @@ -41,7 +41,7 @@ accessLevel | string | Access level of the user requesting the zone. Curr #### ZONE EXAMPLE -``` +```json { "status": "Active", "updated": "2016-12-16T15:27:28Z", @@ -122,7 +122,7 @@ The priority of ACL Rules in descending precedence:
For conflicting rules, the rule that is more specific will take precedence. For example, if the account *jdoe201* was given Read access to all records in a zone through the rule: -``` +```json { "userId": "", "accessLevel": "Read", @@ -131,7 +131,7 @@ through the rule: and then Write access to only A records through the rule: -``` +```json { "userId": "", "accessLevel": "Write", @@ -141,7 +141,7 @@ and then Write access to only A records through the rule: and then Delete access to only A records that matched the expression \*dev\* through the rule: -``` +```json { "userId": "", "accessLevel": "Delete", @@ -154,10 +154,10 @@ then the rule with the recordMask will take precedence and give Delete access to take precedence and give Write access to all other A records, and the more broad rule will give Read access to all other record types in the zone #### ZONE ACL RULE EXAMPLES -**Grant read/write/delete access to www.* records of type A, AAAA, CNAME to one user** -Under this rule, the user specified will be able to view, create, edit, and delete records in the zone that match the expression `www.*` and are of type A, AAAA, or CNAME. +**Grant read/write/delete access to www.* records of type `A`, `AAAA`, `CNAME` to one user** +Under this rule, the user specified will be able to view, create, edit, and delete records in the zone that match the expression `www.*` and are of type `A`, `AAAA`, or `CNAME`. -``` +```json { "recordMask": "www.*", "accessLevel": "Delete", @@ -166,18 +166,18 @@ Under this rule, the user specified will be able to view, create, edit, and dele } ``` -**Grant read only access to all VinylDNS users to A, AAAA, CNAME records** +**Grant read only access to all VinylDNS users to `A`, `AAAA`, `CNAME` records** -``` +```json { "accessLevel": "Read", "recordTypes": ["A", "AAAA", "CNAME"] } ``` -**Grant read/write/delete access to records of type A, AAAA, CNAME to one group*** +**Grant read/write/delete access to records of type `A`, `AAAA`, `CNAME` to one group*** -``` +```json { "accessLevel": "Delete", "groupId": "", @@ -187,48 +187,48 @@ Under this rule, the user specified will be able to view, create, edit, and dele ### PTR ACL RULES WITH CIDR MASKS ACL rules can be applied to specific record types and can include record masks to further narrow down which records they -apply to. These record masks apply to record names, but because PTR record names are part their reverse zone ip, the use of regular +apply to. These record masks apply to record names, but because `PTR` record names are part their reverse zone ip, the use of regular expressions for record masks are not supported.

-Instead PTR record masks must be CIDR rules, which will denote a range of IP addresses that the rule will apply to. +Instead `PTR` record masks must be CIDR rules, which will denote a range of IP addresses that the rule will apply to. While more information and useful CIDR rule utility tools can be found online, CIDR rules describe how many bits of an ip address' binary representation must be the same for a match. ### PTR ACL RULES WITH CIDR MASKS EXAMPLE The ACL Rule -``` +```json { - recordTypes: ["PTR"], - accessLevel: "Read" + "recordTypes": ["PTR"], + "accessLevel": "Read" } ``` -Will give Read permissions to PTR Record Sets to all users in VinylDNS +Will give Read permissions to `PTR` Record Sets to all users in VinylDNS

The **IPv4** ACL Rule -``` +```json { - recordTypes: ["PTR"], - accessLevel: "Read", - recordMask: "100.100.100.100/16" + "recordTypes": ["PTR"], + "accessLevel": "Read", + "recordMask": "100.100.100.100/16" } ``` -Will give Read permissions to PTR Record Sets 100.100.000.000 to 100.100.255.255, as 16 bits is half of an IPv4 address +Will give Read permissions to `PTR` Record Sets 100.100.000.000 to 100.100.255.255, as 16 bits is half of an IPv4 address

The **IPv6** ACL Rule -``` +```json { - recordTypes: ["PTR"], - accessLevel: "Read", - recordMask: "1000:1000:1000:1000:1000:1000:1000:1000/64" + "recordTypes": ["PTR"], + "accessLevel": "Read", + "recordMask": "1000:1000:1000:1000:1000:1000:1000:1000/64" } ``` -Will give Read permissions to PTR Record Sets 1000:1000:1000:1000:0000:0000:0000:0000 to 1000:1000:1000:1000:FFFF:FFFF:FFFF:FFFF, as 64 bits is half of an IPv6 address. +Will give Read permissions to `PTR` Record Sets 1000:1000:1000:1000:0000:0000:0000:0000 to 1000:1000:1000:1000:FFFF:FFFF:FFFF:FFFF, as 64 bits is half of an IPv6 address. #### ZONE CONNECTION ATTRIBUTES In order for VinylDNS to make updates in DNS, it needs key information for every zone. There are 3 ways to specify that key information; ask your VinylDNS admin which is appropriate for your zone based on the configuration of the service: @@ -250,7 +250,7 @@ key | string | The TSIG secret key used to sign requests when com #### ZONE CONNECTION EXAMPLE -``` +```json { "primaryServer": "127.0.0.1:5301", "keyName": "vinyl.", diff --git a/modules/docs/src/main/mdoc/faq.md b/modules/docs/src/main/mdoc/faq.md index 043dc2512..0a4def4c0 100644 --- a/modules/docs/src/main/mdoc/faq.md +++ b/modules/docs/src/main/mdoc/faq.md @@ -32,9 +32,9 @@ of your zone. This ID is also present in the URL (if on that page it’s the ID To create a record with the same name as your zone, you have to use the special `@` character for the record name when you create your record set. -You cannot create CNAME records with *@* as those are not supported. While some DNS services like -Route 53 support an ALIAS record type that _does_ support a CNAME style *@*, ALIAS are not an official standard yet. -All other record types should be fine using the *@* symbol. +You cannot create `CNAME` records with `@` as those are not supported. While some DNS services like +Route 53 support an ALIAS record type that _does_ support a `CNAME` style `@`, ALIAS are not an official standard yet. +All other record types should be fine using the `@` symbol. ### 4. When I try to connect to my zone, I am seeing REFUSED When VinylDNS connects to a zone, it first validates that the zone is suitable diff --git a/modules/docs/src/main/mdoc/getting-help.md b/modules/docs/src/main/mdoc/getting-help.md index b1dcbc21a..86cc5fde0 100644 --- a/modules/docs/src/main/mdoc/getting-help.md +++ b/modules/docs/src/main/mdoc/getting-help.md @@ -6,8 +6,8 @@ position: 7 # Getting Help -- Gitter community: - +- VinylDNS Discussions: + - Contact the VinylDNS Core Team: vinyldns-core@googlegroups.com diff --git a/modules/docs/src/main/mdoc/index.md b/modules/docs/src/main/mdoc/index.md index f06568418..ef8cd8f3f 100644 --- a/modules/docs/src/main/mdoc/index.md +++ b/modules/docs/src/main/mdoc/index.md @@ -21,7 +21,7 @@ VinylDNS helps secure DNS management via: * Recording every change made to DNS records and zones Integration is simple with first-class language support including: -* java -* ruby -* python -* go-lang +* Java +* JavaScript +* Python +* Go diff --git a/modules/docs/src/main/mdoc/operator/config-portal.md b/modules/docs/src/main/mdoc/operator/config-portal.md index 7f119ae08..c61dc99d9 100644 --- a/modules/docs/src/main/mdoc/operator/config-portal.md +++ b/modules/docs/src/main/mdoc/operator/config-portal.md @@ -18,12 +18,9 @@ The portal configuration is much smaller than the API Server. - [Full Example Config](#full-example-config) ## Database Configuration -VinylDNS supports both DynamoDB and MySQL backends (see [API Database Configuration](config-api.html#database-configuration)). - -If using DynamoDB, follow the [AWS DynamoDB Setup Guide](setup-dynamodb.html) first to get the values you need to configure here. - -If using MySQL, follow the [MySQL Setup Guide](setup-mysql.html) first to get the values you need to configure here. +VinylDNS supports a MySQL backend (see [API Database Configuration](config-api.html#database-configuration)). +Follow the [MySQL Setup Guide](setup-mysql.html) first to get the values you need to configure here. The Portal uses the following tables: @@ -37,7 +34,7 @@ the same values in both configs: vinyldns { # this list should include only the datastores being used by your portal instance (user and userChange repo) - data-stores = ["dynamodb", "mysql"] + data-stores = ["mysql"] mysql { @@ -102,39 +99,6 @@ vinyldns { } } } - - dynamodb { - - # this is the path to the DynamoDB provider. This should not be edited - # from the default in reference.conf - class-name = "vinyldns.dynamodb.repository.DynamoDBDataStoreProvider" - - settings { - # AWS_ACCESS_KEY, credential needed to access the SQS queue - key = "x" - - # AWS_SECRET_ACCESS_KEY, credential needed to access the SQS queue - secret = "x" - - # DynamoDB url for the region you are running in, this example is in us-east-1 - endpoint = "https://dynamodb.us-east-1.amazonaws.com" - - # DynamoDB region - region = "us-east-1" - } - - repositories { - # all repositories with config sections here will be enabled in dynamodb - user-change { - # Name of the table where user changes are saved - table-name = "userChangeTest" - # Provisioned throughput for reads - provisioned-reads = 30 - # Provisioned throughput for writes - provisioned-writes = 20 - } - } - } } ``` @@ -216,7 +180,7 @@ links = [ title = "API Documentation" # the hyperlink address being linked to - href = "http://vinyldns.io" + href = "https://vinyldns.io" # a fa icon to display icon = "fa fa-file-text-o" @@ -230,7 +194,7 @@ links = [ The play secret must be set to a secret value, and should be an environment variable ```yaml -# See http://www.playframework.com/documentation/latest/ApplicationSecret for more details. +# See https://www.playframework.com/documentation/latest/ApplicationSecret for more details. play.http.secret.key = "vinyldnsportal-change-this-for-production" ``` @@ -277,7 +241,7 @@ Allows users to schedule changes to be run sometime in the future # # This must be changed for production, but we recommend not changing it in this file. # -# See http://www.playframework.com/documentation/latest/ApplicationSecret for more details. +# See https://www.playframework.com/documentation/latest/ApplicationSecret for more details. play.http.secret.key = "vinyldnsportal-change-this-for-production" # The application languages @@ -374,7 +338,7 @@ links = [ displayOnSidebar = true displayOnLoginScreen = true title = "API Documentation" - href = "http://vinyldns.io" + href = "https://vinyldns.io" icon = "fa fa-file-text-o" } ] diff --git a/modules/docs/src/main/mdoc/operator/pre.md b/modules/docs/src/main/mdoc/operator/pre.md index a3d1c7dfb..6f5492b48 100644 --- a/modules/docs/src/main/mdoc/operator/pre.md +++ b/modules/docs/src/main/mdoc/operator/pre.md @@ -1,137 +1,125 @@ --- -layout: docs -title: "Pre-requisites" +layout: docs title: "Pre-requisites" section: "operator_menu" --- # VinylDNS Pre-requisites -VinylDNS has the following external requirements that need to be setup so that VinylDNS can operate. Those include: + +VinylDNS has the following external requirements that need to be setup so that VinylDNS can operate. Those include: 1. [DNS](#dns) - your DNS servers VinylDNS will interact with 1. [Database](#database) - the database houses all of VinylDNS information including history, records, zones, and users -1. [Message Queue](#message-queues) - the message queue supports high-availability and throttling of commands to DNS backend servers -1. [LDAP](#ldap) - ldap supports both authentication as well as the source of truth for users that are managed inside the VinylDNS database +1. [Message Queue](#message-queues) - the message queue supports high-availability and throttling of commands to DNS + backend servers +1. [LDAP](#ldap) - ldap supports both authentication as well as the source of truth for users that are managed inside + the VinylDNS database ## DNS -VinylDNS is **not a DNS**, rather it integrates with your existing DNS installations to enable DNS self-service and streamline -DNS operations. + +VinylDNS is **not a DNS**, rather it integrates with your existing DNS installations to enable DNS self-service and +streamline DNS operations. VinylDNS communicates to your DNS via: + * `DDNS` - DDNS is used for all record updates * `AXFR` - Zone Transfers are used to load DNS records into the VinylDNS database. -VinylDNS communicates to your DNS using "connections". A connection allows you to specify: +VinylDNS communicates to your DNS using "connections". A connection allows you to specify: + 1. The TSIG key name 1. The TSIG key secret 1. The server (and optionally port) to communicate to DNS with -There are **2** connections, one for DDNS and another for zone transfers. This allows you to use a different DNS server / key -for zone transfers. +There are **2** connections, one for DDNS and another for zone transfers. This allows you to use a different DNS server +/ key for zone transfers. Connections (DDNS and Transfer) can be setup + * `per zone` - every zone can override the global default by specifying its own connections. -* `global default` - assuming you are managing a primary system, you can [configure default zone connections](config-api.html#default-zone-connections). -When no zone connection is specified on a zone, the global defaults will be used. +* `global default` - assuming you are managing a primary system, you + can [configure default zone connections](config-api.html#default-zone-connections). When no zone connection is + specified on a zone, the global defaults will be used. ## Database + [database]: #database -The VinylDNS database has a `NoSQL` / non-relational design to it. Instead of having a heavily normalized set of SQL tables -that surface in the system, VinylDNS relies on `Repositories` where each `Repository` is independent of each one another. -This allows implementers to best map each `Repository` into the data-store of choice. +The VinylDNS database has a `NoSQL` / non-relational design to it. Instead of having a heavily normalized set of SQL +tables that surface in the system, VinylDNS relies on `Repositories` where each `Repository` is independent of each one +another. This allows implementers to best map each `Repository` into the data-store of choice. -As `Repositories` are independent, there are no "transactions" that span repositories. Each `Repository` implementation +As `Repositories` are independent, there are no "transactions" that span repositories. Each `Repository` implementation can choose to use transactions if it maps to multiple tables within itself. -There are **links** across repositories, for example the `RecordSet.id` would be referenced in a `RecordSetChangeRepository`. +There are **links** across repositories, for example the `RecordSet.id` would be referenced in +a `RecordSetChangeRepository`. The following are the repositories presently used by VinylDNS: -* `RecordSetRepository` - Instead of individual DNS records, VinylDNS works at the `RRSet`. The unique key for RecordSet is -the `record name` + `record type` -* `RecordChangeRepository` - The history of all changes to all records in VinylDNS. In general, some kind of pruning strategy -should be implemented otherwise this could get quite large +* `RecordSetRepository` - Instead of individual DNS records, VinylDNS works at the `RRSet`. The unique key for RecordSet + is the `record name` + `record type` +* `RecordChangeRepository` - The history of all changes to all records in VinylDNS. In general, some kind of pruning + strategy should be implemented otherwise this could get quite large * `ZoneRepository` - DNS Zones and managing access to zones -* `ZoneChangeRepository` - The history of all changes made to _zones_ in VinylDNS. Zone changes can including syncs, -updating ACL rules, changing zone ownership, etc. +* `ZoneChangeRepository` - The history of all changes made to _zones_ in VinylDNS. Zone changes can including syncs, + updating ACL rules, changing zone ownership, etc. * `GroupRepository` - VinylDNS Groups -* `UserRepository` - VinylDNS Users. These users are typically created the first time the user logs into the portal. -The user information will be pulled from LDAP, and inserted into the VinylDNS UserRepository +* `UserRepository` - VinylDNS Users. These users are typically created the first time the user logs into the portal. The + user information will be pulled from LDAP, and inserted into the VinylDNS UserRepository * `MembershipRepository` - Holds a link from users to groups * `GroupChangeRepository` - Holds changes to groups and membership -* `BatchChangeRepository` - VinylDNS allows users to submit multiple record changes _across_ DNS zones at the same time within a `Batch` -The `BatchChangeRepository` holds the batch itself and all individual changes that executed in the batch. +* `BatchChangeRepository` - VinylDNS allows users to submit multiple record changes _across_ DNS zones at the same time + within a `Batch` + The `BatchChangeRepository` holds the batch itself and all individual changes that executed in the batch. * `UserChangeRepository` - Holds changes to users. Currently only used in the portal. ## Database Types + ### MySQL -VinylDNS has implemented MySQL for all repositories so a MySQL-only instance of VinylDNS is possible. Furthermore, there are two -repositories that have _only_ been implemented in MySQL: - -1. ZoneRepository -1. BatchChangeRepository - -Originally, the `ZoneRepository` lived in DynamoDB. However, the access controls in VinylDNS made it very difficult -to use DynamoDB as the query interface is limited. A SQL interface with `JOIN`s was required. - -It should also be noted that all of the repositories have also been implemented in MySQL despite most currently running -in DynamoDB in our VinylDNS instance. Review the [Setup MySQL Guide](setup-mysql.html) for more information. -### AWS DynamoDB -VinylDNS has gone through several architecture evolutions. Along the way, DynamoDB was chosen as the data store due to -the volume of data at Comcast. It is an excellent key-value store with extremely high performance characteristics. - -VinylDNS has implemented DynamoDB for the following repositories: - -1. RecordSetRepository -1. RecordChangeRepository -1. ZoneChangeRepository -1. GroupRepository -1. UserRepository -1. MembershipRepository -1. GroupChangeRepository -1. UserChangeRepository - -Currently using DynamoDB would also require the user to either use MySQL for the batch change and zone repositories or also provide -an implementation for those repositories in a different data store. - -Review the [Setup AWS DynamoDB Guide](setup-dynamodb.html) for more information. - ## Message Queues -Most operations that take place in VinylDNS use a message queue. These operations require high-availability, fault-tolerance -with retry, and throttling. The message queue supports these characteristics in VinylDNS. + +Most operations that take place in VinylDNS use a message queue. These operations require high-availability, +fault-tolerance with retry, and throttling. The message queue supports these characteristics in VinylDNS. Some operations do not use the message queue, these include user and group changes as they do not carry the same fault-tolerance and throttling requirements. ## Message Queue Types + ### AWS SQS -Our VinylDNS instance uses AWS SQS to fulfill its message queue service needs. SQS has the following characteristics: + +Our VinylDNS instance uses AWS SQS to fulfill its message queue service needs. SQS has the following characteristics: 1. High-Availability -1. Retry - in the event that a message cannot be processed, or if a node fails midstream processing, it will be automatically -made available for another node to process -1. Back-pressure - SQS is a _pull based_ system, meaning that if VinylDNS is currently busy, new messages will not be pulled for processing. -As soon as a node becomes available, the message will be pulled. This is much preferable to a _push_ based system, where -bottlenecks in processing could cause an increase in heap pressure in the API nodes themselves. -1. Price - SQS is very reasonably priced. Comcast operates multiple message queues for different environments (dev, staging, prod, etc). -The price to use SQS is in the single digit dollars per month. VinylDNS can be tuned to run exclusively in the _free tier_. +1. Retry - in the event that a message cannot be processed, or if a node fails midstream processing, it will be + automatically made available for another node to process +1. Back-pressure - SQS is a _pull based_ system, meaning that if VinylDNS is currently busy, new messages will not be + pulled for processing. As soon as a node becomes available, the message will be pulled. This is much preferable to + a _push_ based system, where bottlenecks in processing could cause an increase in heap pressure in the API nodes + themselves. +1. Price - SQS is very reasonably priced. Comcast operates multiple message queues for different environments (dev, + staging, prod, etc). The price to use SQS is in the single digit dollars per month. VinylDNS can be tuned to run + exclusively in the _free tier_. Review the [Setup AWS SQS Guide](setup-sqs.html) for more information. ### MySQL -VinylDNS has also implemented a message queue using MySQL, which incorporates the features that we currently utilize through AWS SQS -such as changing visibility timeout and re-queuing operations. + +VinylDNS has also implemented a message queue using MySQL, which incorporates the features that we currently utilize +through AWS SQS such as changing visibility timeout and re-queuing operations. Review the [Setup MySQL Guide](setup-mysql.html) for more information. ## LDAP -VinylDNS uses LDAP in order to authenticate users in the **Portal**. LDAP is **not** used in the API, instead the API uses -its own user and group database for authentication. -When a user first logs into VinylDNS, their user information (first name, last name, user name, email) will be pulled from -LDAP, and stored in the `UserRepository`. Credentials will also be generated for the user and stored encrypted in the `UserRepository`. +VinylDNS uses LDAP in order to authenticate users in the **Portal**. LDAP is **not** used in the API, instead the API +uses its own user and group database for authentication. + +When a user first logs into VinylDNS, their user information (first name, last name, user name, email) will be pulled +from LDAP, and stored in the `UserRepository`. Credentials will also be generated for the user and stored encrypted in +the `UserRepository`. Review the [Setup LDAP Guide](setup-ldap.html) for more information diff --git a/modules/docs/src/main/mdoc/operator/setup-api.md b/modules/docs/src/main/mdoc/operator/setup-api.md index 923b54fe7..a88cc5ce7 100644 --- a/modules/docs/src/main/mdoc/operator/setup-api.md +++ b/modules/docs/src/main/mdoc/operator/setup-api.md @@ -8,7 +8,6 @@ section: "operator_menu" The API Server is the main run-time for VinylDNS. To setup the API server, follow these steps: 1. [Pre-requisites](pre.html) -1. [Setup AWS DynamoDB](setup-dynamodb.html) 1. [Setup MySQL](setup-mysql.html) 1. [Setup AWS SQS](setup-sqs.html) 1. [Configure API Server](config-api.html) diff --git a/modules/docs/src/main/mdoc/operator/setup-mysql.md b/modules/docs/src/main/mdoc/operator/setup-mysql.md index f001c4e7d..4bd147923 100644 --- a/modules/docs/src/main/mdoc/operator/setup-mysql.md +++ b/modules/docs/src/main/mdoc/operator/setup-mysql.md @@ -5,11 +5,7 @@ section: "operator_menu" --- # Setup MySQL -Our instance of VinylDNS currently stores some tables in MySQL, though all tables and a queue implementation are available in MySQL. Note -that the `batch_change` and `zone` tables are _only_ available in MySQL. - -The motivation to split databases was due to the query limitations available in AWS DynamoDB. Currently, the following tables are present in -our instance: +Our instance of VinylDNS currently stores data in MySQL. * `zone` - holds zones * `zone_access` - holds user or group identifiers that have access to zones diff --git a/modules/docs/src/main/mdoc/operator/setup-sqs.md b/modules/docs/src/main/mdoc/operator/setup-sqs.md index 3f1e73020..1a5180767 100644 --- a/modules/docs/src/main/mdoc/operator/setup-sqs.md +++ b/modules/docs/src/main/mdoc/operator/setup-sqs.md @@ -14,7 +14,7 @@ You must setup an SQS queue before you can start working with VinylDNS. An [AWS provides the information you need to setup your queue. ## Setting up AWS SQS -As opposed to DynamoDB and MySQL where everything is created when the application starts up, the SQS queue needs to be setup by hand. +As opposed to MySQL where everything is created when the application starts up, the SQS queue needs to be setup by hand. This section goes through those settings that are required. The traffic with AWS SQS is rather low. Presently, Comcast operates multiple SQS queues across multiple environments (dev, staging, prod), diff --git a/modules/docs/src/main/mdoc/permissions.md b/modules/docs/src/main/mdoc/permissions.md index 2f0d37ee1..473646439 100644 --- a/modules/docs/src/main/mdoc/permissions.md +++ b/modules/docs/src/main/mdoc/permissions.md @@ -6,7 +6,7 @@ position: 6 # VinylDNS Permissions Guide -Vinyldns is about making DNS self-service _safe_. There are a number of ways that you can govern access to your DNS infrastucture, from extremely restrictive, to extremely lax, and anywhere in between. +Vinyldns is about making DNS self-service _safe_. There are a number of ways that you can govern access to your DNS infrastructure, from extremely restrictive, to extremely lax, and anywhere in between. This guide attempts to explain the various options available for governing access to your VinylDNS installation. @@ -49,7 +49,7 @@ The original way to govern access is via Zone Ownership and Zone ACLs. When con _Zone Owners_ have full rights on a zone. They can manage the zone, abandon it, change connection information, and assign ACLs. -A `Zone ACL Rule` is a record level control that allows VinylDNS users who are **not** Zone Owners privileges to perform certain actions in the zone. For example, you can **grant access to A, AAAA, CNAME records in Zone foo.baz.com to user Josh** +A `Zone ACL Rule` is a record level control that allows VinylDNS users who are **not** Zone Owners privileges to perform certain actions in the zone. For example, you can **grant access to `A`, `AAAA`, `CNAME` records in Zone foo.baz.com to user Josh** ACL rules provide an extremely flexible way to grant access to DNS records. Each ACL Rule consists of the following: diff --git a/modules/docs/src/main/mdoc/portal/batch-changes.md b/modules/docs/src/main/mdoc/portal/batch-changes.md index 5cdd08366..1b41d6fb4 100644 --- a/modules/docs/src/main/mdoc/portal/batch-changes.md +++ b/modules/docs/src/main/mdoc/portal/batch-changes.md @@ -8,15 +8,15 @@ section: "portal_menu" Batch Changes is an alternative to submitting individual RecordSet changes and provides the following: * The ability to include records of multiple record types across multiple zones. -* Input names are entered as fully-qualified domain names (or IP addresses for **PTR** records), so users don't have to think in record/zone context. +* Input names are entered as fully-qualified domain names (or IP addresses for `PTR` records), so users don't have to think in record/zone context. #### Access * Access permissions will follow existing rules (admin group or ACL access). Note that an update (delete and add of the same record name, zone and record type combination) requires **Write** or **Delete** access. * **NEW** **Records in shared zones.** All users are permitted to create new records or update unowned records in shared zones. #### Supported record types -* Current supported record types for Batch Change are: **A**, **AAAA**, **CNAME**, **PTR**, **TXT**, and **MX**. -* Additionally, there are **A+PTR** and **AAAA+PTR** types that will be processed as separate A (or AAAA) and PTR changes in the VinylDNS backend. Deletes for **A+PTR** and **AAAA+PTR** require Input Name and Record Data. +* Current supported record types for Batch Change are: `A`, `AAAA`, `CNAME`, `PTR`, `TXT`, and `MX`. +* Additionally, there are `A+PTR` and `AAAA+PTR` types that will be processed as separate `A` (or `AAAA`) and `PTR` changes in the VinylDNS backend. Deletes for `A+PTR` and `AAAA+PTR` require Input Name and Record Data. * Supported record types for records in shared zones may vary. Contact your VinylDNS administrators to find the allowed record types. This does not apply to zone administrators or users with specific ACL access rules. diff --git a/modules/docs/src/main/mdoc/portal/dns-changes.md b/modules/docs/src/main/mdoc/portal/dns-changes.md index 0568c1812..5aa556ffc 100644 --- a/modules/docs/src/main/mdoc/portal/dns-changes.md +++ b/modules/docs/src/main/mdoc/portal/dns-changes.md @@ -8,7 +8,7 @@ section: "portal_menu" DNS Changes is an alternative to submitting individual RecordSet changes and provides the following: * The ability to include records of multiple record types across multiple zones. -* Input names are entered as fully-qualified domain names (or IP addresses for **PTR** records), so users don't have to think in record/zone context. +* Input names are entered as fully-qualified domain names (or IP addresses for `PTR` records), so users don't have to think in record/zone context. **Note**: DNS Change is portal-only terminology. The API equivalent is [batch change](../api/batchchange-model.html). @@ -17,8 +17,8 @@ DNS Changes is an alternative to submitting individual RecordSet changes and pro * **NEW** **Records in shared zones.** All users are permitted to create new records or update unowned records in shared zones. #### Supported record types -* Current supported record types for DNS change are: **A**, **AAAA**, **CNAME**, **PTR**, **TXT**, and **MX**. -* Additionally, there are **A+PTR** and **AAAA+PTR** types that will be processed as separate A (or AAAA) and PTR changes in the VinylDNS backend. Deletes for **A+PTR** and **AAAA+PTR** require Input Name and Record Data. +* Current supported record types for DNS change are: `A`, `AAAA`, `CNAME`, `PTR`, `TXT`, and `MX`. +* Additionally, there are `A+PTR` and `AAAA+PTR` types that will be processed as separate `A` (or `AAAA`) and `PTR` changes in the VinylDNS backend. Deletes for `A+PTR` and `AAAA+PTR` require Input Name and Record Data. * Supported record types for records in shared zones may vary. Contact your VinylDNS administrators to find the allowed record types. This does not apply to zone administrators or users with specific ACL access rules. diff --git a/modules/docs/src/main/mdoc/portal/manage-records.md b/modules/docs/src/main/mdoc/portal/manage-records.md index cc2e0ffe9..db9101e7a 100644 --- a/modules/docs/src/main/mdoc/portal/manage-records.md +++ b/modules/docs/src/main/mdoc/portal/manage-records.md @@ -10,7 +10,7 @@ There are currently two ways to manage records in the VinylDNS portal. This cove Only zone administrators and users with ACL rules can manage records this way. #### Supported record types -A, AAAA, CNAME, DS, MX, NAPTR, NS, PTR, SRV, SSHFP, and TXT +`A`, `AAAA`, `CNAME`, `DS`, `MX`, `NAPTR`, `NS`, `PTR`, `SRV`, `SSHFP`, and `TXT` --- diff --git a/modules/docs/src/main/mdoc/portal/search-zones.md b/modules/docs/src/main/mdoc/portal/search-zones.md index e8ab8e4c7..1b9777efa 100644 --- a/modules/docs/src/main/mdoc/portal/search-zones.md +++ b/modules/docs/src/main/mdoc/portal/search-zones.md @@ -19,6 +19,6 @@ Search `test*` returns: test.com., test.net. Search `*example` returns: example.com., another.example.com. Search `*e*` returns: another.example.com., example.com., test.com., test.net., xyz.efg. -[![Seach zones My Zones tab](../img/portal/search-zones-my-zones.png){:.screenshot}](../img/portal/search-zones-my-zones.png) +[![Search zones My Zones tab](../img/portal/search-zones-my-zones.png){:.screenshot}](../img/portal/search-zones-my-zones.png) [![Search zones All Zones tab](../img/portal/search-zones-all-zones.png){:.screenshot}](../img/portal/search-zones-all-zones.png) diff --git a/modules/docs/src/main/mdoc/tools.md b/modules/docs/src/main/mdoc/tools.md index 588714566..dbd348831 100644 --- a/modules/docs/src/main/mdoc/tools.md +++ b/modules/docs/src/main/mdoc/tools.md @@ -18,7 +18,7 @@ There are a few existing tools for working with the VinylDNS API. ## Integrations -- [external-dns](https://github.com/kubernetes-incubator/external-dns) - DNS provider-agnostic syncronization of Cloud Foundry and Kubernetes resources, including VinylDNS +- [external-dns](https://github.com/kubernetes-incubator/external-dns) - DNS provider-agnostic synchronization of Cloud Foundry and Kubernetes resources, including VinylDNS ## Coming Soon - [vinyldns-ansible](https://github.com/vinyldns/vinyldns-ansible) - Ansible integration with VinylDNS diff --git a/project/plugins.sbt b/project/plugins.sbt index d5804b67b..7278e5599 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -26,10 +26,10 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.3.4") addSbtPlugin("com.typesafe.sbt" % "sbt-license-report" % "1.2.0") -addSbtPlugin("com.47deg" % "sbt-microsites" % "1.1.5") +addSbtPlugin("com.47deg" % "sbt-microsites" % "1.3.4") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.3") addSbtPlugin("io.crashbox" % "sbt-gpg" % "0.2.0") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.10" ) +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.24" )