refs #955. New database fields
testing/ogcore-api/pipeline/head This commit looks good Details

develop-jenkins
Manuel Aranda Rosales 2024-10-16 09:12:03 +02:00
parent f8bfffebf1
commit d5e36c6657
17 changed files with 326 additions and 37 deletions

View File

@ -134,6 +134,7 @@ docker exec ogcore-php php bin/console opengnsys:migration:hardware-profile #car
docker exec ogcore-php php bin/console opengnsys:migration:clients #cargamos los clientes
docker exec ogcore-php php bin/console opengnsys:migration:os #cargamos los sistemas operativos
docker exec ogcore-php php bin/console opengnsys:migration:image #cargamos las imagenes
docker exec ogcore-php php bin/console opengnsys:migration:software-profile #cargamos los software profiles
```
## Objetos de interés

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241015154123 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE `partition` CHANGE image_id image_id INT DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE `partition` CHANGE image_id image_id INT NOT NULL');
}
}

View File

@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241016063657 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE software ADD type VARCHAR(255) NOT NULL');
$this->addSql('ALTER TABLE software_profile ADD operative_system_id INT NOT NULL');
$this->addSql('ALTER TABLE software_profile ADD CONSTRAINT FK_B70C3C9BF1E9F66E FOREIGN KEY (operative_system_id) REFERENCES operative_system (id)');
$this->addSql('CREATE INDEX IDX_B70C3C9BF1E9F66E ON software_profile (operative_system_id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE software DROP type');
$this->addSql('ALTER TABLE software_profile DROP FOREIGN KEY FK_B70C3C9BF1E9F66E');
$this->addSql('DROP INDEX IDX_B70C3C9BF1E9F66E ON software_profile');
$this->addSql('ALTER TABLE software_profile DROP operative_system_id');
}
}

View File

@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241016065729 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE software_profile CHANGE operative_system_id operative_system_id INT DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE software_profile CHANGE operative_system_id operative_system_id INT NOT NULL');
}
}

View File

@ -2,9 +2,12 @@
namespace App\Command\Migration;
use App\Entity\OperativeSystem;
use App\Entity\OrganizationalUnit;
use App\Entity\Software;
use App\Entity\SoftwareProfile;
use App\Model\OrganizationalUnitTypes;
use App\Model\SoftwareTypes;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\Persistence\ManagerRegistry;
@ -24,34 +27,131 @@ class MigrateSoftwareAndSoftwareProfileCommand extends Command
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): void
protected function execute(InputInterface $input, OutputInterface $output): int
{
ini_set('memory_limit', '-1');
/** @var EntityManagerInterface $oldDatabaseEntityManager */
$oldDatabaseEntityManager = $this->doctrine->getManager('og_1');
$organizationalUnitRepository = $this->entityManager->getRepository(OrganizationalUnit::class);
$operativeSystemRepository = $this->entityManager->getRepository(OperativeSystem::class);
$softwareProfileRepository = $this->entityManager->getRepository(SoftwareProfile::class);
$softwareRepository = $this->entityManager->getRepository(Software::class);
/** Obtener los perfiles software de la base de datos antigua **/
/** Obtener los software de la base de datos antigua **/
$rsmSoftware = new ResultSetMapping();
$rsmSoftware->addScalarResult('idtiposoftware', 'idtiposoftware');
$rsmSoftware->addScalarResult('idsoftware', 'idsoftware');
$rsmSoftware->addScalarResult('descripcion', 'descripcion');
$rsmSoftware->addScalarResult('grupoid', 'softwares.grupoid');
$rsmSoftware->addScalarResult('idcentro', 'softwares.idcentro');
$rsmSoftware->addScalarResult('idtiposoftware', 'softwares.idtiposoftware');
$softwareQuery = $oldDatabaseEntityManager->createNativeQuery('SELECT idtiposoftware, descripcion FROM softwares', $rsmSoftware);
$softwareQuery = $oldDatabaseEntityManager->createNativeQuery('SELECT idsoftware, softwares.idtiposoftware, softwares.descripcion, softwares.grupoid, softwares.idcentro FROM softwares ', $rsmSoftware);
$softwareCollection = $softwareQuery->getResult();
foreach ($softwareCollection as $software) {
$output->writeln("SOFTWARE TOTAL: ". count($softwareCollection));
foreach ($softwareCollection as $software){
$softwareEntity = null;
$softwareEntity = $softwareRepository->findOneBy(['migrationId' => $software['idtiposoftware']]);
if (!$softwareEntity) {
$softwareEntity = $softwareRepository->findOneBy(['migrationId' => $software['idsoftware']]);
if(!$softwareEntity){
$type = match ($software['softwares.idtiposoftware']) {
1 => SoftwareTypes::OPERATIVE_SYSTEM,
2 => SoftwareTypes::APPLICATION,
3 => SoftwareTypes::FILE,
default => SoftwareTypes::APPLICATION,
};
$softwareEntity = new Software();
$softwareEntity->setMigrationId($software['idtiposoftware']);
$softwareEntity->setName($software['descripcion']);
$softwareEntity->setMigrationId($software['idsoftware']);
$softwareEntity->setDescription($software['descripcion']);
$softwareEntity->setName($software['descripcion']);
$softwareEntity->setType($type);
}
$migrationId = match ($software['softwares.grupoid']) {
0 => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT . '-' . $software['softwares.idcentro'],
default => OrganizationalUnitTypes::CLASSROOMS_GROUP . '-' . $software['softwares.grupoid'],
};
$organizationalUnit = $organizationalUnitRepository->findOneBy(['migrationId' => $migrationId]);
/*
if ($organizationalUnit){
$softwareEntity->setOrganizationalUnit($organizationalUnit);
}*/
$this->entityManager->persist($softwareEntity);
}
/** Obtener los perfiles software de la base de datos antigua **/
$rsmSoftwareProfiles = new ResultSetMapping();
$rsmSoftwareProfiles->addScalarResult('idperfilsoft', 'idperfilsoft');
$rsmSoftwareProfiles->addScalarResult('descripcion', 'descripcion');
$rsmSoftwareProfiles->addScalarResult('comentarios', 'perfilessoft.comentarios');
$rsmSoftwareProfiles->addScalarResult('grupoid', 'perfilessoft.grupoid');
$rsmSoftwareProfiles->addScalarResult('idcentro', 'perfilessoft.idcentro');
$rsmSoftwareProfiles->addScalarResult('idnombreso', 'perfilessoft.idnombreso');
$softwareProfilesQuery = $oldDatabaseEntityManager->createNativeQuery('SELECT idperfilsoft, descripcion, grupos.comentarios, perfilessoft.grupoid, perfilessoft.idcentro, perfilessoft.idnombreso FROM perfilessoft LEFT JOIN grupos ON perfilessoft.grupoid = grupos.idgrupo', $rsmSoftwareProfiles);
$softwareProfiles = $softwareProfilesQuery->getResult();
/** Perfiles software **/
$output->writeln("PERFILES SOFTWARE TOTAL: ". count($softwareProfiles));
foreach ($softwareProfiles as $softwareProfile){
$softwareProfileEntity = null;
$softwareProfileEntity = $softwareProfileRepository->findOneBy(['migrationId' => $softwareProfile['idperfilsoft']]);
if(!$softwareProfileEntity){
$softwareProfileEntity = new SoftwareProfile();
$softwareProfileEntity->setMigrationId($softwareProfile['idperfilsoft']);
$softwareProfileEntity->setDescription($softwareProfile['descripcion']);
$softwareProfileEntity->setComments($softwareProfile['perfilessoft.comentarios']);
}
$migrationId = match ($softwareProfile['perfilessoft.grupoid']) {
0 => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT . '-' . $softwareProfile['perfilessoft.idcentro'],
default => OrganizationalUnitTypes::CLASSROOMS_GROUP . '-' . $softwareProfile['perfilessoft.grupoid'],
};
$organizationalUnit = $organizationalUnitRepository->findOneBy(['migrationId' => $migrationId]);
if ($organizationalUnit){
$softwareProfileEntity->setOrganizationalUnit($organizationalUnit);
}
$operativeSystem = $operativeSystemRepository->findOneBy(['migrationId' => $softwareProfile['perfilessoft.idnombreso']]);
if ($operativeSystem){
$softwareProfileEntity->setOperativeSystem($operativeSystem);
}
$this->entityManager->persist($softwareProfileEntity);
}
/** Obtener los software, y asignarselos a los perfiles software **/
$rsmSoftwareProfilesRelation = new ResultSetMapping();
$rsmSoftwareProfilesRelation->addScalarResult('idperfilsoft', 'idperfilsoft');
$rsmSoftwareProfilesRelation->addScalarResult('idsoftware', 'idsoftware');
$softwareProfilesQuery = $oldDatabaseEntityManager->createNativeQuery('SELECT idperfilsoft, idsoftware FROM perfilessoft_softwares', $rsmSoftwareProfilesRelation);
$softwareProfileRelations = $softwareProfilesQuery->getResult();
$output->writeln("PERFILES SOFTWARE RELACIONES TOTAL: ". count($softwareProfileRelations));
foreach ($softwareProfileRelations as $softwareProfileRelation){
$softwareProfileEntity = $softwareProfileRepository->findOneBy(['migrationId' => $softwareProfileRelation['idperfilsoft']]);
$softwareEntity = $softwareProfileRepository->findOneBy(['migrationId' => $softwareProfileRelation['idsoftware']]);
if ($softwareProfileEntity && $softwareEntity){
$softwareProfileEntity->addHardwareCollection($softwareEntity);
$this->entityManager->persist($softwareProfileEntity);
}
}
$this->entityManager->flush();
return Command::SUCCESS;
}
}

View File

@ -4,6 +4,11 @@ declare(strict_types=1);
namespace App\Controller\OgAgent;
use App\Entity\Client;
use App\Entity\OrganizationalUnit;
use App\Entity\Partition;
use App\Model\OrganizationalUnitTypes;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
@ -14,8 +19,15 @@ use Symfony\Component\Routing\Attribute\Route;
#[AsController]
class OgAdmClientController extends AbstractController
{
#[Route('/opengnsys/rest/__ogAdmClient/InclusionCliente', methods: ['POST'])]
public function inclusionCliente(Request $request): JsonResponse
public function __construct(
protected readonly EntityManagerInterface $entityManager
)
{
}
#[Route('/opengnsys/rest/ogAdmClient/InclusionCliente', methods: ['POST'])]
public function processClient(Request $request): JsonResponse
{
$data = $request->toArray();
$requiredFields = ['iph', 'cfg'];
@ -26,21 +38,49 @@ class OgAdmClientController extends AbstractController
}
}
$clientEntity = $this->entityManager->getRepository(Client::class)->findOneBy(['ip' => $data['iph']]);
if (!$clientEntity) {
return new JsonResponse(['message' => 'Client not found'], Response::HTTP_NOT_FOUND);
}
foreach ($data['cfg'] as $cfg) {
$partitionEntity = $this->entityManager->getRepository(Partition::class)
->findOneBy(['client' => $clientEntity, 'diskNumber' => $cfg['disk'], 'partitionNumber' => $cfg['par']]);
if (!$partitionEntity) {
$partitionEntity = new Partition();
}
$partitionEntity->setClient($clientEntity);
$partitionEntity->setDiskNumber($cfg['disk']);
//$partitionEntity->setPartitionCode($cfg['codpar']);
$partitionEntity->setPartitionNumber($cfg['par']);
$partitionEntity->setSize($cfg['tam']);
$partitionEntity->setMemoryUsage($cfg['uso']);
//$partitionEntity->setFilesystem($cfg['idsistemafichero']);
$this->entityManager->persist($partitionEntity);
$this->entityManager->flush();
}
$center = $this->entityManager->getRepository(OrganizationalUnit::class)->find($clientEntity->getOrganizationalUnit()->getId());
$root = $this->entityManager->getRepository(OrganizationalUnit::class)->getRootNodes();
$responseData = [
'res' => 1,
'ido' => $data['ido'] ?? 42,
'npc' => $data['npc'] ?? 42,
'che' => 42,
'ido' => $clientEntity->getId(),
'npc' => $clientEntity->getName(),
'che' => 1,
'exe' => 42,
'ida' => $data['ida'] ?? 42,
'idc' => $data['idc'] ?? 42,
'ida' => $clientEntity->getOrganizationalUnit()?->getId(),
'idc' => $root[0]->getId(),
];
return new JsonResponse($responseData, Response::HTTP_OK);
}
#[Route('/opengnsys/rest/__ogAdmClient/AutoexecCliente', methods: ['POST'])]
#[Route('/opengnsys/rest/ogAdmClient/AutoexecCliente', methods: ['POST'])]
public function autoexecCliente(Request $request): JsonResponse
{
$data = $request->toArray();
@ -71,7 +111,7 @@ class OgAdmClientController extends AbstractController
return new JsonResponse($responseData, Response::HTTP_OK);
}
#[Route('/opengnsys/rest/__ogAdmClient/enviaArchivo', methods: ['POST'])]
#[Route('/opengnsys/rest/ogAdmClient/enviaArchivo', methods: ['POST'])]
public function enviaArchivo(Request $request): JsonResponse
{
$data = $request->toArray();
@ -95,7 +135,7 @@ class OgAdmClientController extends AbstractController
return new JsonResponse(['contents' => base64_encode($contents)], Response::HTTP_OK);
}
#[Route('/opengnsys/rest/__ogAdmClient/ComandosPendientes', methods: ['POST'])]
#[Route('/opengnsys/rest/ogAdmClient/ComandosPendientes', methods: ['POST'])]
public function comandosPendientes(Request $request): JsonResponse
{
$data = $request->toArray();
@ -122,7 +162,7 @@ class OgAdmClientController extends AbstractController
return new JsonResponse($param, Response::HTTP_OK);
}
#[Route('/opengnsys/rest/__ogAdmClient/DisponibilidadComandos', methods: ['POST'])]
#[Route('/opengnsys/rest/ogAdmClient/DisponibilidadComandos', methods: ['POST'])]
public function disponibilidadComandos(Request $request): JsonResponse
{
$data = $request->toArray();

View File

@ -29,7 +29,8 @@ class SyncAction extends AbstractOgBootController
{
$content = $this->createRequest($httpClient, 'GET', $this->ogBootApiUrl . '/ogboot/v1/oglives');
foreach ($content['installed_ogLives'] as $ogLive) {
foreach ($content['message'] as $ogLive) {
var_dump($ogLive);
$ogLiveEntity = $this->entityManager->getRepository(OgLive::class)->findOneBy(['checksum' => $ogLive['id']]);
if ($ogLiveEntity) {
$this->extracted($ogLiveEntity, $ogLive);
@ -41,7 +42,7 @@ class SyncAction extends AbstractOgBootController
$this->entityManager->persist($ogLiveEntity);
}
$this->entityManager->flush();
$this->serDefaultOgLive($content['default_oglive']);
//$this->serDefaultOgLive($content['default_oglive']);
return new JsonResponse(data: $content, status: Response::HTTP_OK);
}
@ -53,11 +54,11 @@ class SyncAction extends AbstractOgBootController
*/
private function extracted(OgLive|null $ogLiveEntity, mixed $ogLive): void
{
$ogLiveEntity->setName($ogLive['filename']);
$ogLiveEntity->setName($ogLive['directory']);
$ogLiveEntity->setInstalled(true);
$ogLiveEntity->setArchitecture($ogLive['architecture']);
$ogLiveEntity->setDistribution($ogLive['distribution']);
$ogLiveEntity->setFilename($ogLive['filename']);
$ogLiveEntity->setFilename($ogLive['directory']);
$ogLiveEntity->setKernel($ogLive['kernel']);
$ogLiveEntity->setRevision($ogLive['revision']);
$ogLiveEntity->setDirectory($ogLive['directory']);

View File

@ -18,6 +18,11 @@ final class SoftwareInput
#[ApiProperty(description: 'The description of the software', example: "Software 1 description")]
public ?string $description = null;
#[Groups(['software:write'])]
#[ApiProperty(description: 'The type of the software', example: "Software 1 type")]
public ?string $type = null;
public function __construct(?Software $software = null)
{
if (!$software) {
@ -26,6 +31,7 @@ final class SoftwareInput
$this->name = $software->getName();
$this->description = $software->getDescription();
$this->type = $software->getType();
}
public function createOrUpdateEntity(?Software $software = null): Software
@ -36,6 +42,7 @@ final class SoftwareInput
$software->setName($this->name);
$software->setDescription($this->description);
$software->setType($this->type);
return $software;
}

View File

@ -12,25 +12,25 @@ class PartitionOutput extends AbstractOutput
#[Groups(['partition:read', 'client:read'])]
public ?int $diskNumber = null;
#[Groups(['partition:read'])]
public ?string $partitionNumber = null;
#[Groups(['partition:read', 'client:read'])]
public ?int $partitionNumber = null;
#[Groups(['partition:read'])]
#[Groups(['partition:read', 'client:read'])]
public ?string $partitionCode = null;
#[Groups(['partition:read', 'client:read'])]
public ?int $size = null;
#[Groups(['partition:read'])]
#[Groups(['partition:read', 'client:read'])]
public ?string $cacheContent = null;
#[Groups(['partition:read'])]
#[Groups(['partition:read', 'client:read'])]
public ?string $filesystem = null;
#[Groups(['partition:read', 'client:read'])]
public ?OperativeSystemOutput $operativeSystem = null;
#[Groups(['partition:read'])]
#[Groups(['partition:read', 'client:read'])]
public ?int $memoryUsage = null;
public function __construct(Partition $partition)

View File

@ -16,6 +16,9 @@ final class SoftwareOutput extends AbstractOutput
#[Groups(['software:read'])]
public ?string $description = '';
#[Groups(['software:read'])]
public ?string $type = '';
#[Groups(['software:read'])]
public \DateTime $createdAt;
@ -28,6 +31,7 @@ final class SoftwareOutput extends AbstractOutput
$this->name = $software->getName();
$this->description = $software->getDescription();
$this->type = $software->getType();
$this->createdAt = $software->getCreatedAt();
$this->createdBy = $software->getCreatedBy();
}

View File

@ -35,10 +35,11 @@ class Partition extends AbstractEntity
private ?int $memoryUsage = null;
#[ORM\ManyToOne(inversedBy: 'partitions')]
#[ORM\JoinColumn(nullable: true)]
private ?OperativeSystem $operativeSystem = null;
#[ORM\ManyToOne(inversedBy: 'partitions')]
#[ORM\JoinColumn(nullable: false)]
#[ORM\JoinColumn(nullable: true)]
private ?Image $image = null;
public function getDiskNumber(): ?int

View File

@ -21,6 +21,9 @@ class Software extends AbstractEntity
#[ORM\ManyToMany(targetEntity: SoftwareProfile::class, mappedBy: 'softwareCollection')]
private Collection $softwareProfiles;
#[ORM\Column(length: 255)]
private ?string $type = null;
public function __construct()
{
parent::__construct();
@ -66,4 +69,16 @@ class Software extends AbstractEntity
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(string $type): static
{
$this->type = $type;
return $this;
}
}

View File

@ -26,6 +26,10 @@ class SoftwareProfile extends AbstractEntity
#[ORM\ManyToMany(targetEntity: Software::class, inversedBy: 'softwareProfiles')]
private Collection $softwareCollection;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: true)]
private ?OperativeSystem $operativeSystem = null;
public function __construct()
{
parent::__construct();
@ -97,4 +101,16 @@ class SoftwareProfile extends AbstractEntity
return $this;
}
public function getOperativeSystem(): ?OperativeSystem
{
return $this->operativeSystem;
}
public function setOperativeSystem(?OperativeSystem $operativeSystem): static
{
$this->operativeSystem = $operativeSystem;
return $this;
}
}

View File

@ -39,6 +39,7 @@ final class SoftwareFactory extends ModelFactory
return [
'createdAt' => self::faker()->dateTime(),
'name' => self::faker()->text(255),
'type' => self::faker()->text(255),
'updatedAt' => self::faker()->dateTime(),
];
}

View File

@ -36,6 +36,7 @@ final class SoftwareProfileFactory extends ModelFactory
'createdAt' => self::faker()->dateTime(),
'description' => self::faker()->text(255),
'updatedAt' => self::faker()->dateTime(),
'operativeSystem' => OperativeSystemFactory::createOne()->_save(),
'organizationalUnit' => OrganizationalUnitFactory::createOne(['type' => OrganizationalUnitTypes::ORGANIZATIONAL_UNIT])->_save(),
];
}

View File

@ -276,7 +276,7 @@ final readonly class OpenApiFactory implements OpenApiFactoryInterface
));
$openApi
->getPaths()
->addPath('/opengnsys/rest/__ogAdmClient/InclusionCliente', (new Model\PathItem())->withPost(
->addPath('/opengnsys/rest/ogAdmClient/InclusionCliente', (new Model\PathItem())->withPost(
(new Model\Operation('postInclusionCliente'))
->withTags(['OgLive agent'])
->withSummary('Add client to the list of known ones')
@ -324,7 +324,7 @@ final readonly class OpenApiFactory implements OpenApiFactoryInterface
));
$openApi
->getPaths()
->addPath('/opengnsys/rest/__ogAdmClient/AutoexecCliente', (new Model\PathItem())->withPost(
->addPath('/opengnsys/rest/ogAdmClient/AutoexecCliente', (new Model\PathItem())->withPost(
(new Model\Operation('postAutoexecCliente'))
->withTags(['OgLive agent'])
->withSummary('Create and return autoexec file for client')
@ -403,7 +403,7 @@ final readonly class OpenApiFactory implements OpenApiFactoryInterface
));
$openApi
->getPaths()
->addPath('/opengnsys/rest/__ogAdmClient/enviaArchivo', (new Model\PathItem())->withPost(
->addPath('/opengnsys/rest/ogAdmClient/enviaArchivo', (new Model\PathItem())->withPost(
(new Model\Operation('postEnviaArchivo'))
->withTags(['OgLive agent'])
->withSummary('Send the contents of a file')
@ -489,7 +489,7 @@ final readonly class OpenApiFactory implements OpenApiFactoryInterface
));
$openApi
->getPaths()
->addPath('/opengnsys/rest/__ogAdmClient/ComandosPendientes', (new Model\PathItem())->withPost(
->addPath('/opengnsys/rest/ogAdmClient/ComandosPendientes', (new Model\PathItem())->withPost(
(new Model\Operation('postComandosPendientes'))
->withTags(['OgLive agent'])
->withSummary('Retrieve pending commands for a client')
@ -578,7 +578,7 @@ final readonly class OpenApiFactory implements OpenApiFactoryInterface
));
$openApi
->getPaths()
->addPath('/opengnsys/rest/__ogAdmClient/DisponibilidadComandos', (new Model\PathItem())->withPost(
->addPath('/opengnsys/rest/ogAdmClient/DisponibilidadComandos', (new Model\PathItem())->withPost(
(new Model\Operation('postDisponibilidadComandos'))
->withTags(['OgLive agent'])
->withSummary('Check command availability for a client')

View File

@ -7,6 +7,7 @@ use App\Entity\Software;
use App\Factory\OrganizationalUnitFactory;
use App\Factory\SoftwareFactory;
use App\Factory\UserFactory;
use App\Model\SoftwareTypes;
use App\Model\UserGroupPermissions;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
@ -59,6 +60,7 @@ class SoftwareTest extends AbstractTest
$this->createClientWithCredentials()->request('POST', '/software',['json' => [
'name' => self::SW_CREATE,
'type' => SoftwareTypes::FILE
]]);
$this->assertResponseStatusCodeSame(201);
@ -66,7 +68,8 @@ class SoftwareTest extends AbstractTest
$this->assertJsonContains([
'@context' => '/contexts/SoftwareOutput',
'@type' => 'Software',
'name' => self::SW_CREATE
'name' => self::SW_CREATE,
'type' => SoftwareTypes::FILE
]);
}