Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions .tutone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1704,4 +1704,58 @@ packages:
types:
- name: EntityGuid
field_type_override: common.EntityGUID
skip_type_create: true

- name: entitymanagement
path: pkg/entitymanagement
import_path: github.com/newrelic/newrelic-client-go/v2/pkg/entitymanagement
generators:
- typegen
- nerdgraphclient
imports:
- github.com/newrelic/newrelic-client-go/v2/pkg/accounts
- github.com/newrelic/newrelic-client-go/v2/pkg/common
- github.com/newrelic/newrelic-client-go/v2/pkg/nrtime
- github.com/newrelic/newrelic-client-go/v2/pkg/users
queries:
- path: [ "actor", "entityManagement" ]
endpoints:
- name: entity
max_query_field_depth: 4
exclude_fields:
- agents
- tools
- name: entitySearch
max_query_field_depth: 4
exclude_fields:
- agents
- tools
mutations:
- name: entityManagementCreatePipelineCloudRule
max_query_field_depth: 3
- name: entityManagementDelete
max_query_field_depth: 3
types:
- name: ID
field_type_override: string
skip_type_create: true
- name: Nrql
field_type_override: nrdb.NRQL
skip_type_create: true

# nrtime imports
- name: DateTime
field_type_override: nrtime.DateTime
skip_type_create: true
- name: EpochSeconds
field_type_override: nrtime.EpochSeconds
skip_type_create: true
- name: EpochMilliseconds
field_type_override: "*nrtime.EpochMilliseconds"
skip_type_create: true
- name: Minutes
field_type_override: nrtime.Minutes
skip_type_create: true
- name: Seconds
field_type_override: nrtime.Seconds
skip_type_create: true
3 changes: 3 additions & 0 deletions newrelic/newrelic.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"net/http"
"time"

"github.com/newrelic/newrelic-client-go/v2/pkg/entitymanagement"
"github.com/newrelic/newrelic-client-go/v2/pkg/entityrelationship"
"github.com/newrelic/newrelic-client-go/v2/pkg/users"

Expand Down Expand Up @@ -78,6 +79,7 @@ type NewRelic struct {
Workloads workloads.Workloads
KeyTransaction keytransaction.Keytransaction
EntityRelationship entityrelationship.Entityrelationship
EntityManagement entitymanagement.Entitymanagement
Users users.Users

config config.Config
Expand Down Expand Up @@ -128,6 +130,7 @@ func New(opts ...ConfigOption) (*NewRelic, error) {
Workloads: workloads.New(cfg),
KeyTransaction: keytransaction.New(cfg),
EntityRelationship: entityrelationship.New(cfg),
EntityManagement: entitymanagement.New(cfg),
Users: users.New(cfg),
}

Expand Down
23 changes: 23 additions & 0 deletions pkg/entitymanagement/entityManagement.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package entitymanagement

import (
"github.com/newrelic/newrelic-client-go/v2/internal/http"
"github.com/newrelic/newrelic-client-go/v2/pkg/config"
"github.com/newrelic/newrelic-client-go/v2/pkg/logging"
)

type Entitymanagement struct {
client http.Client
logger logging.Logger
config config.Config
}

func New(config config.Config) Entitymanagement {
client := http.NewClient(config)
pkg := Entitymanagement{
client: client,
logger: config.GetLogger(),
config: config,
}
return pkg
}
69 changes: 69 additions & 0 deletions pkg/entitymanagement/entityManagement_integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
//go:build integration
// +build integration

package entitymanagement

import (
"fmt"
"testing"

"github.com/stretchr/testify/require"

"github.com/newrelic/newrelic-client-go/v2/pkg/nrdb"
"github.com/newrelic/newrelic-client-go/v2/pkg/testhelpers"
)

func newIntegrationTestClient(t *testing.T) Entitymanagement {
tc := testhelpers.NewIntegrationTestConfig(t)
return New(tc)
}

func TestIntegrationEntityManagement_PipelineCloudRule_CRUD(t *testing.T) {
t.Parallel()

client := newIntegrationTestClient(t)
accountID, _ := testhelpers.GetTestAccountID()

// Generate a unique name for the test rule
ruleName := fmt.Sprintf("test-rule-%s", testhelpers.RandSeq(5))
createInput := EntityManagementPipelineCloudRuleEntityCreateInput{
Name: ruleName,
Description: "A test pipeline cloud rule from integration testing.",
NRQL: nrdb.NRQL("DELETE FROM Log where name = 'test-client-go-terraform'"),
Scope: EntityManagementScopedReferenceInput{
Type: EntityManagementEntityScopeTypes.ACCOUNT,
ID: fmt.Sprintf("%d", accountID),
},
}

// 1. Create the entity
createResult, err := client.EntityManagementCreatePipelineCloudRule(createInput)

fmt.Println("Create Result:", createResult.Entity.Description)
require.NoError(t, err)
require.NotNil(t, createResult)
require.NotEmpty(t, createResult.Entity.ID)
require.Equal(t, ruleName, createResult.Entity.Name)

// Defer the deletion to ensure cleanup even if assertions fail
defer func() {
_, deleteErr := client.EntityManagementDelete(createResult.Entity.ID, createResult.Entity.Metadata.Version)
require.NoError(t, deleteErr, "Failed to clean up entity %s", createResult.Entity.ID)
}()

// 2. Read the entity to verify creation
getResult, err := client.GetEntity(createResult.Entity.ID)
require.NoError(t, err)
require.NotNil(t, getResult)

// Type assert the result to access specific fields
ruleEntity, ok := (*getResult).(*EntityManagementPipelineCloudRuleEntity)
require.True(t, ok, "Fetched entity was not of the expected type")
require.Equal(t, createResult.Entity.ID, ruleEntity.ID)
require.Equal(t, createInput.Name, ruleEntity.Name)
require.Equal(t, createInput.Description, ruleEntity.Description)
require.Equal(t, createInput.NRQL, ruleEntity.NRQL)

// 3. Delete the entity (this is handled by the deferred function)
// The test will complete, and the deferred function will execute for cleanup.
}
145 changes: 145 additions & 0 deletions pkg/entitymanagement/entityManagement_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
//go:build unit
// +build unit

package entitymanagement

import (
"context"
"net/http"
"testing"

"github.com/stretchr/testify/require"

mock "github.com/newrelic/newrelic-client-go/v2/pkg/testhelpers"
)

var (
testAccountID = "12345"
testRuleID = "test-rule-id"
testVersion = 1

testCreateResponseJSON = `
{
"data": {
"entityManagementCreatePipelineCloudRule": {
"entity": {
"id": "test-rule-id",
"metadata": {
"version": 1
},
"name": "Test Rule",
"description": "A test rule",
"nrql": "SELECT * FROM Log"
}
}
}
}`

testGetResponseJSON = `
{
"data": {
"actor": {
"entityManagement": {
"entity": {
"__typename": "EntityManagementPipelineCloudRuleEntity",
"id": "test-rule-id",
"metadata": {
"version": 1
},
"name": "Test Rule",
"description": "A test rule",
"nrql": "SELECT * FROM Log",
"scope": {
"id": "12345",
"type": "ACCOUNT"
}
}
}
}
}
}`

testDeleteResponseJSON = `
{
"data": {
"entityManagementDelete": {
"id": "test-rule-id"
}
}
}`
)

func newMockClient(t *testing.T, mockJSONResponse string, statusCode int) Entitymanagement {
ts := mock.NewMockServer(t, mockJSONResponse, statusCode)
tc := mock.NewTestConfig(t, ts)
return New(tc)
}

func TestUnitEntityManagement_CreatePipelineCloudRule(t *testing.T) {
t.Parallel()
client := newMockClient(t, testCreateResponseJSON, http.StatusOK)

createInput := EntityManagementPipelineCloudRuleEntityCreateInput{
Name: "Test Rule",
Description: "A test rule",
NRQL: "SELECT * FROM Log",
Scope: EntityManagementScopedReferenceInput{
Type: EntityManagementEntityScopeTypes.ACCOUNT,
ID: testAccountID,
},
}

result, err := client.EntityManagementCreatePipelineCloudRule(createInput)

require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, testRuleID, result.Entity.ID)
require.Equal(t, "Test Rule", result.Entity.Name)
}

func TestUnitEntityManagement_GetEntity(t *testing.T) {
t.Parallel()
client := newMockClient(t, testGetResponseJSON, http.StatusOK)

result, err := client.GetEntity(testRuleID)

require.NoError(t, err)
require.NotNil(t, result)

ruleEntity, ok := (*result).(*EntityManagementPipelineCloudRuleEntity)
require.True(t, ok)
require.Equal(t, testRuleID, ruleEntity.ID)
require.Equal(t, "Test Rule", ruleEntity.Name)
}

func TestUnitEntityManagement_DeleteEntity(t *testing.T) {
t.Parallel()
client := newMockClient(t, testDeleteResponseJSON, http.StatusOK)

result, err := client.EntityManagementDelete(testRuleID, testVersion)

require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, testRuleID, result.ID)
}

func TestUnitEntityManagement_DeleteEntityWithContext(t *testing.T) {
t.Parallel()
client := newMockClient(t, testDeleteResponseJSON, http.StatusOK)

result, err := client.EntityManagementDeleteWithContext(context.Background(), testRuleID, testVersion)

require.NoError(t, err)
require.NotNil(t, result)
require.Equal(t, testRuleID, result.ID)
}

func TestUnitEntityManagement_GetEntity_Error(t *testing.T) {
t.Parallel()
client := newMockClient(t, `{"errors": [{"message": "Not Found"}]}`, http.StatusNotFound)

result, err := client.GetEntity("non-existent-id")

require.Error(t, err)
require.Nil(t, result)
}
Loading
Loading