diff --git a/modules/api/src/main/scala/vinyldns/api/domain/zone/ZoneProtocol.scala b/modules/api/src/main/scala/vinyldns/api/domain/zone/ZoneProtocol.scala index d65143b64..d926cea9f 100644 --- a/modules/api/src/main/scala/vinyldns/api/domain/zone/ZoneProtocol.scala +++ b/modules/api/src/main/scala/vinyldns/api/domain/zone/ZoneProtocol.scala @@ -111,7 +111,8 @@ case class RecordSetInfo( records: List[RecordData], id: String, account: String, - accessLevel: AccessLevel) + accessLevel: AccessLevel, + ownerGroupId: Option[String]) object RecordSetInfo { def apply(recordSet: RecordSet, accessLevel: AccessLevel): RecordSetInfo = RecordSetInfo( zoneId = recordSet.zoneId, @@ -124,7 +125,8 @@ object RecordSetInfo { records = recordSet.records, id = recordSet.id, account = recordSet.account, - accessLevel = accessLevel + accessLevel = accessLevel, + ownerGroupId = recordSet.ownerGroupId ) } diff --git a/modules/api/src/main/scala/vinyldns/api/route/DnsJsonProtocol.scala b/modules/api/src/main/scala/vinyldns/api/route/DnsJsonProtocol.scala index be6df50c7..90200784d 100644 --- a/modules/api/src/main/scala/vinyldns/api/route/DnsJsonProtocol.scala +++ b/modules/api/src/main/scala/vinyldns/api/route/DnsJsonProtocol.scala @@ -178,7 +178,8 @@ trait DnsJsonProtocol extends JsonValidation { recordType .andThen(extractRecords(_, js \ "records")), (js \ "id").default[String](UUID.randomUUID().toString), - (js \ "account").default[String]("system") + (js \ "account").default[String]("system"), + (js \ "ownerGroupId").optional[String] ).mapN(RecordSet.apply) // Put additional record set level checks below @@ -200,7 +201,8 @@ trait DnsJsonProtocol extends JsonValidation { ("updated" -> Extraction.decompose(rs.updated)) ~ ("records" -> Extraction.decompose(rs.records)) ~ ("id" -> rs.id) ~ - ("account" -> rs.account) + ("account" -> rs.account) ~ + ("ownerGroupId" -> rs.ownerGroupId) } case object RecordSetInfoSerializer extends ValidationSerializer[RecordSetInfo] { @@ -221,7 +223,8 @@ trait DnsJsonProtocol extends JsonValidation { ("records" -> Extraction.decompose(rs.records)) ~ ("id" -> rs.id) ~ ("account" -> rs.account) ~ - ("accessLevel" -> rs.accessLevel.toString) + ("accessLevel" -> rs.accessLevel.toString) ~ + ("ownerGroupId" -> rs.ownerGroupId) } def extractRecords(typ: RecordType, js: JValue): ValidatedNel[String, List[RecordData]] = diff --git a/modules/api/src/test/scala/vinyldns/api/protobuf/ProtobufConversionsSpec.scala b/modules/api/src/test/scala/vinyldns/api/protobuf/ProtobufConversionsSpec.scala index 25a234b8f..eeafddf57 100644 --- a/modules/api/src/test/scala/vinyldns/api/protobuf/ProtobufConversionsSpec.scala +++ b/modules/api/src/test/scala/vinyldns/api/protobuf/ProtobufConversionsSpec.scala @@ -470,6 +470,7 @@ class ProtobufConversionsSpec pb.getTtl shouldBe aRs.ttl pb.getTyp shouldBe aRs.typ.toString pb.getZoneId shouldBe aRs.zoneId + pb.hasOwnerGroupId shouldBe false pb.getRecordCount shouldBe 2 } @@ -481,6 +482,21 @@ class ProtobufConversionsSpec rs shouldBe aRs } + "convert to protobuf for a recordset with ownerGroupId defined" in { + val rs = aRs.copy(ownerGroupId = Some("ownerGroupId")) + val pb = toPB(rs) + + pb.hasOwnerGroupId shouldBe true + Some(pb.getOwnerGroupId) shouldBe rs.ownerGroupId + } + + "convert from protobuf for a recordset with ownerGroupId defined" in { + val rs = aRs.copy(ownerGroupId = Some("ownerGroupId")) + val pb = toPB(rs) + + fromPB(pb) shouldBe rs + } + "convert from protobuf for AAAA recordset" in { fromPB(toPB(aaaa)) shouldBe aaaa } diff --git a/modules/core/src/main/protobuf/VinylDNSProto.proto b/modules/core/src/main/protobuf/VinylDNSProto.proto index 3c7db8273..4b9079569 100644 --- a/modules/core/src/main/protobuf/VinylDNSProto.proto +++ b/modules/core/src/main/protobuf/VinylDNSProto.proto @@ -110,6 +110,7 @@ message RecordSet { optional int64 updated = 8; repeated RecordData record = 9; required string account = 10; + optional string ownerGroupId = 11; } message RecordSetChange { diff --git a/modules/core/src/main/scala/vinyldns/core/domain/record/RecordSet.scala b/modules/core/src/main/scala/vinyldns/core/domain/record/RecordSet.scala index 8adeaacc6..d34ab759f 100644 --- a/modules/core/src/main/scala/vinyldns/core/domain/record/RecordSet.scala +++ b/modules/core/src/main/scala/vinyldns/core/domain/record/RecordSet.scala @@ -43,7 +43,8 @@ case class RecordSet( updated: Option[DateTime] = None, records: List[RecordData] = List.empty, id: String = UUID.randomUUID().toString, - account: String = "system") { + account: String = "system", + ownerGroupId: Option[String] = None) { def isPending: Boolean = (status == RecordSetStatus.Pending @@ -60,7 +61,8 @@ case class RecordSet( sb.append("ttl=\"").append(ttl.toString).append("\"; ") sb.append("account=\"").append(account).append("\"; ") sb.append("status=\"").append(status.toString).append("\"; ") - sb.append("records=\"").append(records.toString).append("\"") + sb.append("records=\"").append(records.toString).append("\"; ") + sb.append("ownerGroupId=\"").append(ownerGroupId).append("\"") sb.append("]") sb.toString diff --git a/modules/core/src/main/scala/vinyldns/core/protobuf/ProtobufConversions.scala b/modules/core/src/main/scala/vinyldns/core/protobuf/ProtobufConversions.scala index 179d33cd5..561a48757 100644 --- a/modules/core/src/main/scala/vinyldns/core/protobuf/ProtobufConversions.scala +++ b/modules/core/src/main/scala/vinyldns/core/protobuf/ProtobufConversions.scala @@ -72,7 +72,8 @@ trait ProtobufConversions { id = rs.getId, records = rs.getRecordList.asScala.map(rd => fromPB(rd, RecordType.withName(rs.getTyp))).toList, - account = rs.getAccount + account = rs.getAccount, + ownerGroupId = if (rs.hasOwnerGroupId) Some(rs.getOwnerGroupId) else None ) def fromPB(zn: VinylDNSProto.Zone): Zone = @@ -286,6 +287,7 @@ trait ProtobufConversions { .setAccount(rs.account) rs.updated.foreach(dt => builder.setUpdated(dt.getMillis)) + rs.ownerGroupId.foreach(id => builder.setOwnerGroupId(id)) // Map the records, first map to bytes, and then map the bytes to a record data instance rs.records.map(toRecordData).foreach(rd => builder.addRecord(rd))